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中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章