2011-12-27 41 views
0

我的應用程序使用記錄有兩種方式.... 1)程序化2)的log4j.xml 我有兩個(1使用程序化和其他使用的log4j.xml中創建日誌文件)位置。的Log4j:有趣的問題,需要解決

程序化的方式(多了一個屬性文件中,所有的東西都提像日誌級別和所有....讓say..thorugh這...文件越來越created..name爲「SAS_VP。日誌「):

Enumeration loggers = Logger.getRootLogger().getLoggerRepository().getCurrentLoggers(); 
    ...... 
    Logger temp = (Logger)iter.next();             
    temp.setLevel(level); 

的log4j.xml

<appender name="FILE" class="org.apache.log4j.RollingFileAppender"> 
    <param name="File" value="/LOGS/SAM/SAM_VJ.log"/> 
    <param name="Threshold" value="DEBUG"/> 
    <param name="MaxFileSize" value="10000KB"/> 
    <param name="MaxBackupIndex" value="10"/> 
    <param name="Append" value="false"/> 

<layout class="org.apache.log4j.PatternLayout"> 

    <param name="ConversionPattern" value="%d{dd MMM yyyy HH:mm:ss,SSS} [%t] %5p [%F(% M):%L] %m%n"/> 

</layout> 

</appender> 


<root> 
<appender-ref ref="CONSOLE"/> 
<appender-ref ref="FILE"/> 
</root> 

問題:

日誌級別,我設定編程覆蓋 log4j.xml.Like中的log4j.xml日誌級別設置的級別「調試」,並通過編程我已經設置了級別爲「錯誤」,那麼文件(SAM_VJ.log),它由創建log4j.xml只包含ERROR級別日誌。

如何解決這個問題...我想...我的兩個日誌記錄(編程和log4j)應該是獨立的。

是否有任何的log4j中...如果我已經設置了一個包「com.sas」的日誌級別爲「調試」,那麼沒有人可以修改...像可變類型

<logger name="com.sam">  
<priority value="DEBUG"/> 
</logger> 

尋找你的建議....

回答

0

我不確定你真的應該問這樣的功能。 你在談論的方式來配置log4j的框架,是的,它支持3種不同的配置方式:

  1. 屬性文件
  2. xml配置
  3. 編程,通過Java代碼

對我來說編程配置允許更改log4j記錄器/ appenders的配置狀態。

您的xml配置應在系統啓動時加載,然後應用覆蓋配置的java代碼。

如果您有用Java提供配置的邏輯,那麼爲什麼不改進邏輯並僅在您確實希望這樣做時定義錯誤級別(在您的示例中)。

它不可能配置相同的記錄器與DEBUG級別(及以上)錯誤級別(及以上)一起工作。

這實際上是一個功能,而不是缺點,因爲它允許在運行的系統上更改LOG4j的行爲(無需重新啓動),這對於問題跟蹤很有用。

當然,您可以將您的記錄器寫入,以便它們不會允許setLevel,但是,我真的不明白爲什麼要這麼做。

希望,這有助於

+0

** @ Mark Bramnik:** **我的屬性文件:** ###日誌級別。 ###值{ALARM,ERROR,WARNING,TRACE,PRINT} 1.1.1 =錯誤
###日誌目錄1.1.2 =/LOGS/SAM/** Java代碼:**枚舉記錄器= Logger.getRootLogger() .getLoggerRepository()getCurrentLoggers(); //它獲取所有記錄器
...... Logger temp =(Logger)iter.next(); temp.setLevel(電平); //設置的級別來自屬性文件 – VJS 2011-12-27 07:01:43

+0

** log4j.xml:** 我希望包「com.sas」下的代碼總是按照log4j.xml中提到的日誌級別來發送 \t <優先級值=」 DEBUG「/> VJS 2011-12-27 07:04:26

+0

**問題:** 這裏通過Java代碼....記錄器爲 」com.sas「 也被modified.I希望出現這種情況通過java代碼,我不應該設置記錄器級別「com.sas」...我如何將此傳遞給java代碼....我不能看到任何API,我可以通過它獲取記錄器並在log4j中指定。 如果我以這種方式獲得log4j.xml中指定的日誌記錄級別不應該得到改變.....我認爲這不可能,因爲您提到了...它通過java代碼獲取覆蓋。 ... **任何解決方案... ** – VJS 2011-12-27 07:04:48

0

爲什麼不直接使用兩個附加目的地不同的日誌級別,而不是嗎?你可以添加levelMax和levelMin PARAMS告訴Log4j提供的附加器只需登錄那些水平。

<param name="LevelMax" value="warn" /> 
<param name="LevelMin" value="info" />