log4j.aditivity实现某类日志只输出到特定file

第一种需求:将log4j level高的输出到一个特定的文件,以便查看。

下面展示一个log4j配置来实现这一功能

### set log levels ###  
log4j.rootLogger = debug ,  stdout ,  D ,  E 
  
### 输出到控制台 ###  
log4j.appender.stdout = org.apache.log4j.ConsoleAppender  
log4j.appender.stdout.Target = System.out  
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout  
log4j.appender.stdout.layout.ConversionPattern =  %d{ABSOLUTE} %5p %c{ 1 }:%L - %m%n  
  
### 输出到日志文件 ###  
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender  
log4j.appender.D.File = logs/log.log  
log4j.appender.D.Append = true  
log4j.appender.D.Threshold = DEBUG ## 输出DEBUG级别以上的日志  
log4j.appender.D.layout = org.apache.log4j.PatternLayout  
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n  
  
### 保存异常信息到单独文件 ###  
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender  
log4j.appender.E.File = /logs/error.log ## 异常日志文件名  
log4j.appender.E.Append = true  
log4j.appender.E.Threshold = ERROR ## 只输出ERROR级别以上的日志!!!  
log4j.appender.E.layout = org.apache.log4j.PatternLayout  
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %l:%c:%t:%r ] - [ %p ]  %m%n 
这样配置后Error级别的日志机会出现在log.log中也会出现在error.log。具体可以参考 Log4j 日志配置示例详解

第二种需求:除此之外我们可能会有另外一种需求,程序中某一类的日志我想单独输出到一个文件,并且是只出现在这个文件,而无需出现在其他的log中。比如说我想将redis业务日志单独输出到一个日志文件中,而不输出到普通日志文件。此时可以按照如下方式编写log4j配置

### set log levels ###  
log4j.rootLogger = debug ,  stdout , file
  
### 输出到控制台 ###  
log4j.appender.stdout = org.apache.log4j.ConsoleAppender  
log4j.appender.stdout.Target = System.out  
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout  
log4j.appender.stdout.layout.ConversionPattern =  %d{ABSOLUTE} %5p %c{ 1 }:%L - %m%n  
  
### 输出到日志文件 ###  
log4j.appender.file = org.apache.log4j.DailyRollingFileAppender  
log4j.appender.file.File = logs/log.log  
log4j.appender.file.Append = true  
log4j.appender.file.Threshold = INFO ## 输出INFO级别以上的日志  
log4j.appender.file.layout = org.apache.log4j.PatternLayout  
log4j.appender.file.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n  
  
### 保存redis日志到单独文件 ###  
log4j.logger.RedisLog = debug, redis
log4j.appender.redis=org.apache.log4j.RollingFileAppender
log4j.appender.redis.File=${log.dir}/redis.log
log4j.appender.redis.MaxFileSize=10MB
log4j.appender.redis.MaxBackupIndex=3
log4j.appender.redis.layout=org.apache.log4j.PatternLayout
log4j.appender.redis.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n
log4j.additivity.RedisLog=false

按照这中方式配置后,redis业务日志就不会输出到log.log中了,只会存在于redis.log。

这里发挥关键作用的是log4j.additivity这个设置。log4j.additivity是 子Logger 是否继承 父Logger 的 输出源(appender) 的标志位。具体说,默认情况下 子Logger 会继承 父Logger 的appender,也就是说 子Logger 会在 父Logger 的appender里输出。若是additivity设为false,则 子Logger 只会在自己的appender里输出,而不会在 父Logger 的appender里输出。 

在上面展示的log4j配置中,子logger就是RedisLog,而父logger是rootLogger,设置log4j.additivity 为false之后,子logger日志将不会出现在父logger rootLogger中,也即不会出现在stdout和file两个appender中。

log4j.additivity 默认值为true,默认是子logger日志会写入到父logger中。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值