log4j的logger继承性(推荐看)
2016-09-19 16:12
155 查看
http://blog.csdn.net/java_belucky/article/details/22267795
最近在做项目的时候,需要给多个包定义不同的log策略,比如在包com.test.a下的log记录到文件file1.log中,包com.test.b下的log记录到文件file2.log中,其他的log记录到file0.log中。最初是如下定义的:
log4j.rootLogger=error, stdout, file0
# appender 1:stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %5p [%t] - %m%n
# appender 2:file 0
log4j.appender.file0=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file0.layout=org.apache.log4j.PatternLayout
log4j.appender.file0.DatePattern='.'yyyy-MM-dd
log4j.appender.file0.file=D:/log/file0.log
log4j.appender.file0.layout.ConversionPattern=%d %5p [%t] - %m%n
# appender 3:file1
log4j.appender.file1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file1.layout=org.apache.log4j.PatternLayout
log4j.appender.file1.DatePattern='.'yyyy-MM-dd
log4j.appender.file1.file=D:/log/file1.log
log4j.appender.file1.layout.ConversionPattern=%d %5p [%t] - %m%n
# appender 4:file2
log4j.appender.file2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file2.layout=org.apache.log4j.PatternLayout
log4j.appender.file2.layout.ConversionPattern=%d %5p [%t] - %m%n
log4j.appender.file2.file=D:/log/file2.log
log4j.appender.file2.layout.ConversionPattern=%d %5p [%t] - %m%n
log4j.logger.com.test.a=info, stdout, file1
log4j.logger.com.test.b=info, stdout, file2
这样定义之后会发现file1.log,file2.log可以正常记录日志,但是在file0.log中也记录了file1.log,file2.log中的日志。就是说记录重复了。
以上问题的关键是log4j的logger是继承性的,子logger会叠加式地继承父logger的所有appender。
比如:
log4j.logger.com.test = info, stdout
log4j.logger.com.test.a = info, stdout 这里会叠加继承2次,所以会输出2份
结果会导致test.a下的所有日志会在stdout输出两次。
解决方案有以下两种:
1.不定义全局log4j.rootLogger,给不同包的logger指定不同的appender。
2.给子logger定义additive属性的标识,默认是true,是继承父logger的。只要定义成为false就可以了。
比如上面的问题只要按照以下定义就可以了:
log4j.logger.com.test.a=info, stdout, file1
log4j.additivity.com.test.a=false
log4j.logger.com.test.b=info, stdout, file2
log4j.additivity.com.test.b=false
顶
0
最近在做项目的时候,需要给多个包定义不同的log策略,比如在包com.test.a下的log记录到文件file1.log中,包com.test.b下的log记录到文件file2.log中,其他的log记录到file0.log中。最初是如下定义的:
log4j.rootLogger=error, stdout, file0
# appender 1:stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %5p [%t] - %m%n
# appender 2:file 0
log4j.appender.file0=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file0.layout=org.apache.log4j.PatternLayout
log4j.appender.file0.DatePattern='.'yyyy-MM-dd
log4j.appender.file0.file=D:/log/file0.log
log4j.appender.file0.layout.ConversionPattern=%d %5p [%t] - %m%n
# appender 3:file1
log4j.appender.file1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file1.layout=org.apache.log4j.PatternLayout
log4j.appender.file1.DatePattern='.'yyyy-MM-dd
log4j.appender.file1.file=D:/log/file1.log
log4j.appender.file1.layout.ConversionPattern=%d %5p [%t] - %m%n
# appender 4:file2
log4j.appender.file2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file2.layout=org.apache.log4j.PatternLayout
log4j.appender.file2.layout.ConversionPattern=%d %5p [%t] - %m%n
log4j.appender.file2.file=D:/log/file2.log
log4j.appender.file2.layout.ConversionPattern=%d %5p [%t] - %m%n
log4j.logger.com.test.a=info, stdout, file1
log4j.logger.com.test.b=info, stdout, file2
这样定义之后会发现file1.log,file2.log可以正常记录日志,但是在file0.log中也记录了file1.log,file2.log中的日志。就是说记录重复了。
以上问题的关键是log4j的logger是继承性的,子logger会叠加式地继承父logger的所有appender。
比如:
log4j.logger.com.test = info, stdout
log4j.logger.com.test.a = info, stdout 这里会叠加继承2次,所以会输出2份
结果会导致test.a下的所有日志会在stdout输出两次。
解决方案有以下两种:
1.不定义全局log4j.rootLogger,给不同包的logger指定不同的appender。
2.给子logger定义additive属性的标识,默认是true,是继承父logger的。只要定义成为false就可以了。
比如上面的问题只要按照以下定义就可以了:
log4j.logger.com.test.a=info, stdout, file1
log4j.additivity.com.test.a=false
log4j.logger.com.test.b=info, stdout, file2
log4j.additivity.com.test.b=false
顶
0
相关文章推荐
- 初学Dos汇编的三本参考书籍
- 知乎大牛的关于JS解答
- 做SEO推广必须要做的9件事儿
- 兼容iOS 10 资料整理笔记
- 微信分享流程
- 微信分享流程
- 微信分享流程
- poj2155 Matrix
- 初级动画
- javascript实现的左右无缝滚动效果
- WAMPServer的安装及配置
- HDU 3068 最长回文
- protobuf for lua 实现
- Android 做一款直播APP?一分钟掌握乐视云直播Demo
- ansible对windows系统的管控
- CCF 201403-2 我只有70分
- 图像处理里面的尺度是什么
- CItrix StoreFront 3 优化
- Linux 服务器设置定时任务(整理)
- 设计模式之模板方法模式