我使用log4j的写入多个日志文件时具有重复的日志信息的麻烦。
目前我正在试图登录INFO
级数据(及以上)的具体命名foobar的记录器在我foo.log
文件,然后所有WARN
在所有记录器级别的日志消息(及以上) bar.log
文件。
由于这一结果,重复的日志消息被写入foo.log
文件(每行已登录两次)和一些简单的研究,我发现,建议,解决这一问题后,添加log4j.additivity.foobar=false
到我的属性文件。
这里的问题是,虽然它停止重复的线条, WARN
从foobar的记录信息都不会被写到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
属性),并且仍然防止重复的日志消息?
请注意,这是问题的简单概括。 在现实世界中的场景有多个记录器和两个以上的日志文件
这个问题可以分为两个部分来解决。
1.防止重复日志消息
因为我们列出了rootLogger和log4j.logger.foobar类别均FOO附加器的日志消息被写入两次。 因此,我们必须去掉附加器,只定义类的日志记录级别:
log4j.rootLogger = WARN, FOO, BAR
log4j.logger.foobar = INFO
这意味着,从log4j.logger.foobar的INFO级别的消息向上传播到所有伐木者追加程序在rootLogger,但仅会被写入到每个日志文件。
被写入2.防止INFO级别消息bar.log
由于所有的log4j.logger.foobar类别INFO级别的日志信息正在受到rootLogger的追加程序继承,我们需要停止BAR
的appender用于记录INFO级别的消息。
我们可以通过设置在BAR附加器本身的阈值属性做到这一点:
log4j.appender.BAR.Threshold = WARN
这将防止在bar.log文件被记录的信息级别陈述它只接受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