2013-11-01 47 views
3

我做了一個使用log4j的應用程序。一切工作正常,但是,當我製作該應用程序的jar並將其附加到另一個應用程序時,日誌記錄停止工作(不創建日誌文件)。我認爲問題在於這個最後的應用程序還包含另一個jar(除了我的)已經使用log4j。順便說一句,這個另一個jar是hadoop,我認爲它正在採用日誌上下文。我的log4j屬性文件在類路徑,以及在罐子的根:2個jar庫如何獨立使用log4j?

log4j.logger.abc = DEBUG,A1

log4j.appender.A1 = org.apache.log4j.FileAppender log4j.appender.A1.File = my-log.log log4j.appender.A1.layout = org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern =%d {yy/MM/dd HH :MM:SS}%p %C {2}:%M%N

怎麼辦排序這一點?

謝謝。

+0

您是否對兩個應用程序(my-log.log)使用相同的日誌文件? – EdgeCase

+0

我發佈的屬性文件位於類路徑中,也是jar中唯一的文件。我只想記錄我的應用程序,所以我沒有添加任何關於其他罐子的東西。 – user252816

回答

6

首先,我能想到的是,可能是HBase的公司或者Hadoop的log4j.properties被遮蔽的log4j.properties文件,在你的資源目錄的作爲,HBase的是使用它首先是自己log4j.properties文件已經在類路徑中。

在用HBase的或者Hadoop的使用log4j.properties,你可能沒有你的 'A1' 附加器一套可實際登錄到 '我的-log.log'

其次如果您在應用程序開始時未使用PropertyConfigurator.configure(path to your customLog4j.properties);配置log4j,則更有可能正在拾取HBase或Hadoop的log4j.properties。

最後,我可以建議嘗試,如果你已經不PropertyConfigurator.configure()試過,是重命名你的應用程序特定log4j.properties文件到別的東西說mylog4j.properties並嘗試使用,在PropertyConfigurator作爲PropertyConfigurator.configure(mylog4j.properties);

1

你說你在使用Hadoop。你在HDFS上運行這個嗎?如果這樣Hadoop被配置爲使用位於HDFS上的log4j屬性文件。所以你需要更新該日誌文件。

通常,包含在jar文件中的log4j.properties被忽略。這是因爲它是驅動應用程序,它應該控制要執行的日誌記錄,而不管記錄它使用的庫需要什麼。如果我正在創建應用程序,那麼我沒有爲每個使用的庫創建日誌文件。我使用一個log4j配置文件,從那裏可以控制所有庫的日誌記錄。

+3

如果@ user252816沒有收到任何實際的運行時錯誤,問題幾乎可以肯定的是,使用中的配置並未設置爲記錄他的東西;將一個'log4j.properties'放在一個jar裏是沒有問題的(作爲一個後備和一個例子),但它通常是被映射的。 – chrylis

+0

我沒有在HDFS上運行它。這只是一個需要hadoop jar的HBase客戶端應用程序。 我試圖爲我正在使用的應用程序創建單個log4j配置,從而創建一個名爲resources的文件夾,其中包含屬性文件並將其放入類路徑中。我用的配置和我的問題一樣。然而,它沒有效果,因爲只執行了hadoop/hbase日誌記錄(而不是我的jar庫的日誌記錄)。 – user252816

0

正如你所說的,你正在創建的應用程序有log4j,當你將它製作成jar時,這並不重要,因爲一旦你將它轉換成jar,jar就不會有你的log4j。所有你需要知道的是,你需要使用記錄器相同的應用程序,你的jar將被添加爲依賴。

讓我們如果它戰爭和你的jar會成爲它的一部分,那麼你的jar將使用戰爭使用的log4j屬性。因此您需要檢查您的目標應用程序是否使用相同的log4j,並檢查日誌屬性文件和日誌文件,您可能會收到您的jar日誌,我的意思是您配置的日誌文件位置不同於您配置的日誌文件位置在你的jar裏log4j文件屬性

0

使用PropertyConfigurator.configure();應該可以解決你的問題。確保在應用程序加載配置時使用它。