Log4j按级别输出到不同文件

之前曾写过一篇帖子,是log4j按包路径输出到不同文件。

log4j按级别输出到不同文件,也类似。

先看配置:

  1. ### set log levels ###    
  2. log4j.rootLogger=info,error,info  
  3. log4j.appender.stdout=org.apache.log4j.ConsoleAppender     
  4. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout     
  5. log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n     
  6.       
  7. log4j.logger.info=info  
  8. log4j.appender.info=com.zznode.log.MyAppender    
  9. log4j.appender.info.layout=org.apache.log4j.PatternLayout     
  10. log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n  
  11. log4j.appender.info.datePattern='.'yyyy-MM-dd     
  12. log4j.appender.info.Threshold = INFO   
  13. log4j.appender.info.append=false   
  14. log4j.appender.info.File=D:/log4j/info.log   
  15.   
  16.   
  17. log4j.logger.error=error  
  18. log4j.appender.error=com.zznode.log.MyAppender     
  19. log4j.appender.error.layout=org.apache.log4j.PatternLayout     
  20. log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n   
  21. log4j.appender.error.datePattern='.'yyyy-MM-dd     
  22. log4j.appender.error.Threshold = ERROR     
  23. log4j.appender.error.append=false   
  24. log4j.appender.error.File=D:/log4j/error.log   


测试类:

  1. import org.apache.log4j.PropertyConfigurator;  
  2. import org.apache.log4j.xml.DOMConfigurator;  
  3.   
  4. import com.zznode.test.Test;  
  5.   
  6. /** 
  7.  * @desc: 
  8.  * @since Nov 8, 2012 
  9.  * @author chaisson  
  10.  * 
  11.  * <p> 
  12.  */  
  13. public class Log4jApp {  
  14.       
  15.     public void printLog() {  
  16.         Logger log = Logger.getLogger(Log4jApp.class.getClass());  
  17.         log.info("测试info");  
  18.         log.debug("测试debug");  
  19.         log.error("测试error");  
  20.     }  
  21.       
  22.      public static void main(String[] args) {  
  23.   
  24.            //DOMConfigurator.configure("log4j.xml");  
  25.            PropertyConfigurator.configure("D:/workspace/Test/log4j-new.properties");    
  26.   
  27.            Log4jApp app = new Log4jApp();  
  28.            app.printLog();  
  29.              
  30.           // Test test = new Test();  
  31.           //test.printLog();  
  32.        }  
  33. }  

输出结果有点问题:info.log里面也包含了error的输出。

配置中关键的配置说明是这一句:
log4j.appender.debug.Threshold = INFO 
而它的作用是输出INFO级别以上的内容到info.log中,所以info.log文件中包含了ERROR级别的文件。

解决办法是:定义自己的Appender类,继承DailyRollingFileAppender,改写针对Threshold 的设置说明(重写针对级别的比较方法)

源代码

  1. public boolean isAsSevereAsThreshold(Priority priority)  {    
  2.      return threshold == null || priority.isGreaterOrEqual(threshold);    
  3. }    

重写 isAsSevereAsThreshold(Priority priority)方法

  1. /** 
  2.  * @desc: 
  3.  * @since Apr 17, 2013 
  4.  * @author chaisson  
  5.  * 
  6.  * <p> 
  7.  */  
  8. public class MyAppender extends DailyRollingFileAppender {  
  9.       
  10.     @Override  
  11.     public boolean isAsSevereAsThreshold(Priority priority) {    
  12.           //只判断是否相等,而不判断优先级     
  13.         return this.getThreshold().equals(priority);    
  14.     }    
  15. }  


这样,进行唯一判断,只有当Threshold与priority一致时,才进行输出,就实现了真正Log4j按照级别输出日志文件。
修改配置文件:

  1. ### set log levels ###    
  2. log4j.rootLogger=info,error,info  
  3. log4j.appender.stdout=org.apache.log4j.ConsoleAppender     
  4. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout     
  5. log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n     
  6.       
  7. log4j.logger.info=info  
  8. log4j.appender.info=com.zznode.log.MyAppender    
  9. log4j.appender.info.layout=org.apache.log4j.PatternLayout     
  10. log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n  
  11. log4j.appender.info.datePattern='.'yyyy-MM-dd     
  12. log4j.appender.info.Threshold = INFO   
  13. log4j.appender.info.append=false   
  14. log4j.appender.info.File=D:/log4j/info.log   
  15.   
  16.   
  17. log4j.logger.error=error  
  18. log4j.appender.error=com.zznode.log.MyAppender     
  19. log4j.appender.error.layout=org.apache.log4j.PatternLayout     
  20. log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n   
  21. log4j.appender.error.datePattern='.'yyyy-MM-dd     
  22. log4j.appender.error.Threshold = ERROR     
  23. log4j.appender.error.append=false   
  24. log4j.appender.error.File=D:/log4j/error.log   

这样才算完成了。

补充:有同事讨论,如果是XML配置,通过filter会简便:

    1. <filter class="org.apache.log4j.varia.LevelRangeFilter">  
    2. <param name="LevelMin" value="ERROR"/>  
    3. <param name="LevelMax" value="ERROR"/>  
    4. </filter>  
原文地址:https://www.cnblogs.com/shihaiming/p/5725497.html