log4j基本配置

log4j是Java Web中最常用的日志输出框架,这里记录下常用配置。

在log4j中日志添加器(Appender)负责将日志事件(LogEvent)传递给相应的目的地,Appender的常用实现有很多,比如ConsoleAppender,AsyncAppender,FileAppender等等,有各自的应用场景。

关于日志输出级别请自行理解。

DailyRollingFileAppender继承自FileAppender,顾名思义,就是以一定得周期决定是否对日志文件进行转存(roll over),是否对日志文件转存取决于DatePattern,转存后的文件名也依赖于DatePattern的配置。

DatePattern遵循SimpleDateFormat的模式,指定的字符常量放在单引号中。例如下面的配置表明日志输出级别是INFO,日志添加器(Appender )的名称是foo,采用的文件追加方式是DailyRollingFileAppender,日志输出文件名是foo.log,每天凌晨会把当日日志文件重命名为foo.log2016-10-08.log的形式,次日的日志输出文件仍然是foo.log。

LOG_DIR=D:\\logs
log4j.logger.com.vonzhou.learn.Foo=info,foo
log4j.appender.foo=org.apache.log4j.DailyRollingFileAppender
log4j.appender.foo.File=${LOG_DIR}/foo.log
log4j.appender.foo.DatePattern=yyyy-MM-dd'.log'

作者:Chown
链接:https://zhuanlan.zhihu.com/p/22912027
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

更多的转存调度可以参考1:


PatternLayout的目的是格式化日志输出,结果依赖于ConversionPattern的配置。更详细的格式含义参考2,下面是几个常用的。

格式化转义字符含义c类全名,后面可以指定输出精度d日志,后面可以指定日期格式p输出日志级别L输出日志输出语句所在源文件的行号m应用层日志输出的具体消息n换行符

log4j.additivity用于控制子Logger是否把日志也添加到父Logger的文件中,比如:

log4j.logger.com.vonzhou.learn.foo=info,foo
log4j.logger.com.vonzhou.learn.foo.bar=info,bar

就配置了foo,bar两个log appender,其中bar的父亲是foo,默认情况下bar的日志输出也会加到foo的输出中,所以可以使用log4j.additivity配置true/false改变默认,比如下面配置bar的日志输出不加到foo的输出中。

log4j.additivity.com.vonzhou.learn.foo.bar = false

Threshold日志级别阈值用于过滤特定的日志级别(AppenderSkeleton的源码中有说明),当日志事件到达Appender的时候,低于该阈值的都将忽略,比如下面的配置把ERROR级别的日志错误单独到一个文件中。

log4j.appender.error.Threshold=ERROR

配置举例

输出到控制台:

log4j.rootLogger =info, stdout                                                               
log4j.appender.app=org.apache.log4j.ConsoleAppender                                          
log4j.appender.app.Target=System.out                                                         
log4j.appender.app.layout=org.apache.log4j.PatternLayout                                     
log4j.appender.app.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n

指定整个应用的日志输出:

log4j.rootLogger =info, app
log4j.appender.app=org.apache.log4j.DailyRollingFileAppender
log4j.appender.app.File=${LOG_DIR}/app.log
log4j.appender.app.DatePattern=yyyy-MM-dd'.log'
log4j.appender.app.Append=true
log4j.appender.app.layout=org.apache.log4j.PatternLayout
log4j.appender.app.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n

为不同的模块分别制定不同的输出文件:

log4j.logger.com.vonzhou.learn.foo=info,foo
log4j.appender.foo=org.apache.log4j.DailyRollingFileAppender
log4j.appender.foo.File=${LOG_DIR}/foo.log
log4j.appender.foo.DatePattern=yyyy-MM-dd'.log'
log4j.appender.foo.Append=true
log4j.appender.foo.layout=org.apache.log4j.PatternLayout
log4j.appender.foo.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c:%L - %m%n

把所有的错误日志单独到一个文件中:

LOG_DIR=D:\\logs                                                                              
log4j.rootLogger =DEBUG, app, error                                                           
                                                                                              
log4j.appender.app=org.apache.log4j.DailyRollingFileAppender                                  
log4j.appender.app.Threshold=DEBUG                                                            
log4j.appender.app.File=${LOG_DIR}/app.log                                                    
log4j.appender.app.DatePattern=yyyy-MM-dd'.log'                                               
log4j.appender.app.Append=true                                                                
log4j.appender.app.layout=org.apache.log4j.PatternLayout                                      
log4j.appender.app.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n   
                                                                                              
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender                                
log4j.appender.error.Threshold=ERROR                                                          
log4j.appender.error.File=${LOG_DIR}/error.log                                                
log4j.appender.error.DatePattern=yyyy-MM-dd'.log'                                             
log4j.appender.error.Append=true                                                              
log4j.appender.error.layout=org.apache.log4j.PatternLayout                                    
log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n 
                                                                                              
                                                                                              
log4j.logger.com.vonzhou.learn.foo=info,foo                                                   
log4j.appender.foo=org.apache.log4j.DailyRollingFileAppender                                  
log4j.appender.foo.File=${LOG_DIR}/foo.log                                                    
log4j.appender.foo.DatePattern=yyyy-MM-dd'.log'                                               
log4j.appender.foo.Append=true                                                                
log4j.appender.foo.layout=org.apache.log4j.PatternLayout                                      
log4j.appender.foo.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n

上述虽然把错误日志单独输出到了error.log文件中,但是ERROR日志同样会输出到其他日志文件中,单独出来真是为了便于排查问题,不至于淹没。

总结

本文使用的是log4j 1,很多异步的特性有待继续学习。

参考

  1. DailyRollingFileAppender
  2. PatternLayout
  3. Appenders

 

posted @ 2016-10-13 15:58  HappyRocky  阅读(254)  评论(0编辑  收藏  举报