2012-11-29 64 views
40

我在使用log4j写入多个日志文件时遇到重复的日志消息。Log4j:多个记录器,级别和appenders

目前我想在我的foo.log文件记录INFO级数据(及以上)的命名foobar的的具体记录,然后bar.log文件中的所有记录仪所有WARN级别的日志消息(及以上) 。

因此,将重复的日志消息写入foo.log文件(每行记录了两次),经过一些快速调查后发现解决此问题的建议是将log4j.additivity.foobar=false添加到我的属性文件中。

这样做的问题是,虽然它停止重复的线路,从foobar的记录器WARN消息永远不会写入bar.log文件。

我log4j属性文件如下:

log4j.rootLogger = WARN, FOO, BAR 
log4j.logger.foobar = INFO, FOO 
log4j.additivity.foobar = false 

log4j.appender.FOO = org.apache.log4j.RollingFileAppender 
log4j.appender.FOO.layout = org.apache.log4j.PatternLayout 
log4j.appender.FOO.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n 
log4j.appender.FOO.File = foo.log 

log4j.appender.BAR = org.apache.log4j.RollingFileAppender 
log4j.appender.BAR.layout = org.apache.log4j.PatternLayout 
log4j.appender.BAR.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n 
log4j.appender.BAR.File = bar.log 

有谁知道我可以写日志消息,这两个日志文件(因为它之前,我开始设置additivity财产做),并且仍然防止重复的日志消息?

请注意,这是对问题的简要总结。在现实世界中,有多个记录器和两个以上的日志文件

回答

54

此问题可以分两部分解决。

1.防止重复登录的消息

,因为我们在上市的同时rootLoggerlog4j.logger.foobarFOO appender的消息被写入两次日志。因此,我们必须去掉附加器,只定义类别的日志记录级别:

log4j.rootLogger = WARN, FOO, BAR 
log4j.logger.foobar = INFO 

这意味着,从log4j.logger.foobarINFO级别的消息向上传播到所有伐木者追加程序的 in rootLogger,但只会写入每个日志文件一次。

被写入2.防止INFO级别消息bar.log

由于所有为log4j.logger.foobar类别INFO级的日志消息正在被追加程序继承在rootLogger ,我们需要停止用于记录级别消息的INFO appender。

我们可以通过设置在BAR阈值属性附加器本身实现这一点:

log4j.appender.BAR.Threshold = WARN 

这将防止被记录在bar.log文件作为INFO级报表它只会接受WARN及以上的水平。

所以完整的log4j属性文件将是如下:

log4j.rootLogger = WARN, FOO, BAR 
log4j.logger.foobar = INFO 

log4j.appender.FOO = org.apache.log4j.RollingFileAppender 
log4j.appender.FOO.layout = org.apache.log4j.PatternLayout 
log4j.appender.FOO.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n 
log4j.appender.FOO.File = foo.log 
log4j.appender.FOO.Threshold = INFO 

log4j.appender.BAR = org.apache.log4j.RollingFileAppender 
log4j.appender.BAR.layout = org.apache.log4j.PatternLayout 
log4j.appender.BAR.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n 
log4j.appender.BAR.File = bar.log 
log4j.appender.BAR.Threshold = WARN 
+0

这是所有好的和不好,但这不是什么问。这是如何通过记录器区分的?原始问题说只有'foobar'去foo,并且包括foobar在内的所有记录器都去吧 –

+0

这个问题要求一个解决方案,其中'foobar'记录器的所有'INFO'消息都转到'foo.log'文件和所有'所有记录器的WARN'消息都转到'bar.log'文件(并且每个日志消息只在适当的文件中写入一次)。 –

+0

不,__all loggers__,不只是'foobar'发送到'bar.log'。按照这样的问题: “目前我正在试图登录一个'foobar'我foo.log文件,然后在酒吧__all loggers__所有'WARN'级别的日志信息的特定记录'INFO'级别的数据。日志文件“。 –