Log4J 如何分開Logger輸出

今天和兩個同事討論Log4j,他們都需要解決一個問題,怎麼分開輸出Logger。這麼講不清楚,舉個例子:

 

 

Java代碼  收藏代碼
  1. package com.gmail.at.ankyhe.log4jtest;  
  2.   
  3. import org.apache.log4j.Logger;  
  4.   
  5. public class ClassA {  
  6.       
  7.     private static Logger logger = Logger.getLogger(ClassA.class.getName());  
  8.       
  9.     public ClassA() {  
  10.         logger.info("ENTER ClassA()");  
  11.     }  
  12.       
  13.     public void foo() {  
  14.         logger.info("foo()");  
  15.         bar();  
  16.     }  
  17.       
  18.     public void bar() {  
  19.         Logger myLog = Logger.getLogger("bar");  
  20.         myLog.debug("bar()D");  
  21.         myLog.info("bar()I");  
  22.     }  
  23.   
  24. }  

 我希望bar可以輸出到一個地方,其他的logger可以輸出到一個地方。一般的配置文件如下:

 

Xml代碼  收藏代碼
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">  
  3.   
  4. <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/' >  
  5.   
  6.   <appender name="myConsole" class="org.apache.log4j.ConsoleAppender">  
  7.     <layout class="org.apache.log4j.PatternLayout">  
  8.       <param name="ConversionPattern"    
  9.         value="[%d{dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n" />  
  10.     </layout>  
  11.   </appender>  
  12.   
  13.   <appender name="myFile" class="org.apache.log4j.RollingFileAppender">    
  14.     <param name="File" value="xml.log" />  
  15.     <param name="Append" value="false" />  
  16.     <param name="MaxBackupIndex" value="10" />  
  17.     <layout class="org.apache.log4j.PatternLayout">  
  18.       <param name="ConversionPattern" value="%p (%c:%L)- %m%n" />  
  19.     </layout>  
  20.   </appender>  
  21.   
  22.   
  23.   <logger name="bar">  
  24.     <level value="info" />   
  25.     <appender-ref ref="myConsole" />   
  26.   </logger>  
  27.     
  28.   <root>  
  29.     <priority value="debug" />  
  30.     <appender-ref ref="myFile" />  
  31.   </root>  
  32. </log4j:configuration>  

 這樣會發現一個問題,myLog的輸出又會在文件,又會在終端。原因在Log4J官方的Introduction講的很清楚:

http://logging.apache.org/log4j/1.2/manual.html  搜索Appender Additivity. 我解釋一下就是默認情況下bar會集成root的輸出。知道了原因,那怎麼修改就簡單了。

 

Xml代碼  收藏代碼
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">  
  3.   
  4. <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/' >  
  5.   
  6.   <appender name="myConsole" class="org.apache.log4j.ConsoleAppender">  
  7.     <layout class="org.apache.log4j.PatternLayout">  
  8.       <param name="ConversionPattern"    
  9.         value="[%d{dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n" />  
  10.     </layout>  
  11.   </appender>  
  12.   
  13.   <appender name="myFile" class="org.apache.log4j.RollingFileAppender">    
  14.     <param name="File" value="xml.log" />  
  15.     <param name="Append" value="false" />  
  16.     <param name="MaxBackupIndex" value="10" />  
  17.     <layout class="org.apache.log4j.PatternLayout">  
  18.       <param name="ConversionPattern" value="%p (%c:%L)- %m%n" />  
  19.     </layout>  
  20.   </appender>  
  21.   
  22.   
  23.   <logger name="bar" additivity="false">  
  24.     <level value="info" />   
  25.     <appender-ref ref="myConsole" />   
  26.   </logger>  
  27.     
  28.   <root>  
  29.     <priority value="debug" />  
  30.     <appender-ref ref="myFile" />  
  31.   </root>  
  32. </log4j:configuration>  

 唯一的區別是在bar那個logger後面加了一個 additivity="false"。我試了一下,可以按照要求工作。這是xml的配置,一般的property的配置如下:

 

Xml代碼  收藏代碼
  1. log4j.rootLogger=DEBUG, FA  
  2. log4j.category.bar = INFO, CA  
  3. log4j.additivity.bar = false  
  4.   
  5. #Console Appender  
  6.   
  7. log4j.appender.CA=org.apache.log4j.ConsoleAppender  
  8. log4j.appender.CA.layout=org.apache.log4j.PatternLayout  
  9. log4j.appender.CA.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n  
  10.   
  11. #File Appender  
  12. log4j.appender.FA=org.apache.log4j.FileAppender  
  13. log4j.appender.FA.File=property.log  
  14. log4j.appender.FA.layout=org.apache.log4j.PatternLayout  
  15. log4j.appender.FA.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n  
  16.   
  17.              
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章