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'
链接: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,很多异步的特性有待继续学习。
参考