Log4j : 多个记录器、级别和附加器[英] Log4j : Multiple loggers, levels and appenders

本文是小编为大家收集整理的关于Log4j : 多个记录器、级别和附加器的处理/解决方法,可以参考本文帮助大家快速定位并解决问题,中文翻译不准确的可切换到English标签页查看源文。

问题描述

使用log4j写入多个日志文件时,我在重复的日志消息上遇到麻烦.

目前,我正在尝试记录INFO级别数据(及向上)的特定记录器,以 foobar 在我的foo.log>文件中,然后所有WARN级>级别的日志消息(并向上向上) )对于 bar.log文件中的所有登录器.

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

问题是,尽管它停止了重复线,但来自 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.防止重复的日志消息

日志消息是两次编写的,因为我们在 foo appender rootlogger 和 log4j.logger.foobar 类别中列出了 foo .因此,我们必须删除Appender,仅定义类别中的记录级别:

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

这意味着 info log4j.logger.foobar 都向上传播到所有伐木者附录 in rootlogger ,但只会写入每个日志文件一次.

2.防止信息级消息写入bar.log

由于 logbar.foobar 类别的所有信息级别的日志消息已由 rootlogger 继承,因此我们需要停止BAR录制 info 级消息的appender.

我们可以通过在 bar上设置阈值 bar appender本身来实现这一目标:

log4j.appender.BAR.Threshold = WARN

这将防止 info 级别的语句被记录在 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

本文地址:https://www.itbaoku.cn/post/1574785.html

问题描述

I am having trouble with duplicate log messages when writing to multiple log files using log4j.

At present I am trying to log INFO level data (and upwards) for the specific logger named foobar in my foo.log file and then all WARN level log messages (and upwards) for all loggers in the bar.log file.

As a result of this, duplicate log messages were written to the foo.log file (each line was logged twice) and after some quick research I found that the suggestion to fix this was to add log4j.additivity.foobar=false to my properties file.

The problem with this is that although it stops duplicate lines, the WARN message from the foobar logger are never written to the bar.log file.

My log4j properties file is as follows:

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

Does anyone know how I can write the log messages to both log files (as it was doing before I started setting the additivity property) and still prevent the duplicate log messages?

Please note, this is a simplified summary of the problem. In the real world scenario there are multiple loggers and more than two log files

推荐答案

This problem can be solved in two parts.

1. Prevent duplicate log messages

The log messages were written twice because we listed the FOO appender in both the rootLogger and the log4j.logger.foobar category. So we must remove the appender and only define the logging level in category:

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

This means that the INFO level messages from log4j.logger.foobar are propagated upwards to ALL of the loggers the appenders in rootLogger, but will only be written to each log file once.

2. Prevent INFO level message being written to bar.log

Since all of the INFO level log messages for the log4j.logger.foobar category are being inherited by the appenders in rootLogger, we need to stop the BAR appender for recording the INFO level messages.

We can achieve this by setting the Threshold property on the BAR appender itself:

log4j.appender.BAR.Threshold = WARN

This will prevent the INFO level statements being logged in the bar.log file as it will only accept levels of WARN and upwards.

So the complete log4j properties file would be as follows:

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