zoukankan      html  css  js  c++  java
  • 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>  
  • 相关阅读:
    linux 进程操作脚本
    go 项目监听重启
    go 小题
    beego 基础
    beego 接口开发
    beego 安装
    mongo curd
    html的学习(一)
    ssl
    java编码的学习
  • 原文地址:https://www.cnblogs.com/shihaiming/p/5725497.html
Copyright © 2011-2022 走看看