当前位置: 首页 > 知识库问答 >
问题:

Log4j:多个记录器、级别和附加器

邓业
2023-03-14

在使用log4j写入多个日志文件时,我遇到了重复日志消息的问题。

目前,我正在尝试在我的foo.log文件中记录名为foobar的特定记录器的info级数据(及以上),然后在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

有人知道我如何将日志消息写入两个日志文件(就像我开始设置additivility属性之前所做的那样),并且仍然防止重复的日志消息吗?

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

共有1个答案

范峰
2023-03-14

这个问题可以分两部分解决。

1.防止重复日志消息

日志消息被写入了两次,因为我们在rootLogger和log4j.logger.foobar类别中都列出了FOO appender。因此我们必须删除附加器,并且只定义category中的日志级别:

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

这意味着来自log4j.logger.foobar的信息级消息会向上传播到rootLogger中的所有日志程序(即附加程序),但只会写入每个日志文件一次。

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

由于log4j.logger.foobar类别的所有信息级日志消息都由rootLogger中的附加程序继承,因此我们需要停止bar附加程序来记录信息级消息。

我们可以通过在BAR appender本身上设置Threshold属性来实现这一点:

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
 类似资料:
  • 问题内容: 我想在我的应用程序(Spring Integration)中有两个日志文件,debug.log和main.log。我想在INFO级别运行main.log,在DEBUG级别运行debug.log。这可以通过追加程序上的过滤器完成。我想根据源将不同级别记录到附加程序。换一种说法 总结一下: 弹簧记录器 主要->错误 调试->调试 com.myapp记录器 主要->信息 调试->调试 因此,

  • 我的团队使用来控制我们的, 在中,我们可以选择更改中的级别, 我们为每个(线程)有一个单独的记录器,如果我们想只看到一个线程的控制台日志,我们关闭所有其他线程记录器,问题是每个记录器都为和某个文件发送输出,我们只想关闭stdout输出。 log4j2.xml配置示例: 我们尝试了很多解决方案: 将父记录器与可加性结合使用,并将每个附加器分离到不同的记录器,对此有什么想法吗?

  • 我的记录器只记录根记录器ServerAppenderV2上的消息,日志文件是正确生成的,当我在root中使用change the level to debug时,我可以在root中定义的两个appender中看到日志,但在文件appenders FileAppender和perfappender中仍然没有日志。 对于以下代码: 下面是我的Logger类和标记: 下面是我的配置log4j2.xml:

  • 我正在用Java编写一个REST服务(在Tomcat 9上使用JAX-RS标准),我想向我的程序添加日志,以便在调用时跟踪他的工作。 因此,我使用Log4j(版本1.2.17)来编写日志,我想为在REST服务上运行的每个服务编写不同的日志文件,但我只需要为整个应用程序使用一个Log4j属性 所以我想在我的日志文件夹中保存这种日志 所以我把它写成Log4j(restServiceLogger.pro

  • 我想做的很直截了当: 我只希望在控制台追加器上显示重要的消息,而我希望将详细的消息路由到文件追加器。 我还尝试向添加一个ThresholdFilter,但这也不能过滤它。

  • 现在,问题是,当我以以下方式进行日志记录时: 尽管根记录器级别被设置为“错误”,但日志条目仍然存在于两个日志文件中。然而,当我去掉“it.pkg.testpkg.service”记录器(通过注释或删除它)时,条目停止进入根记录器。我不太清楚这是怎么回事。 目前,我已经找到了一个临时解决方案,方法是在“root_file_appender”中添加以下条目: 谢了。