如何在log4j2中抑制重复的消息

时间:2015-11-12 10:10:22

标签: java log4j2

我是Java和log4j2的新手,很抱歉这个奇怪的问题。我的问题如下。我写了一个使用log4j2进行日志记录的应用程序。程序分析数据并在无法按需要解析给定字符串的情况下写入警告。有时程序会获得大量意外的字符串,因此它会记录所有相同的错误消息。所以,问题是,如何避免一遍又一遍地记录相同的错误消息。相反,例如在日志文件中看到相同的错误消息2000次,我想在日志文件中有一个提示,这个错误消息写了x次。我当前的log4j2配置文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Properties>
        <Property name="pattern">%d{DEFAULT} %-5p %-18.18c %4.4L [%-15.15t] %m%n</Property>
    </Properties>

    <Appenders>
        <Console name="STDERR" target="SYSTEM_ERR">
            <PatternLayout pattern="${pattern}" />
        </Console>
    </Appenders>
    <Loggers>
        <Root level="warn">
            <AppenderRef ref="STDERR" />
        </Root>
    </Loggers>
</Configuration>

2 个答案:

答案 0 :(得分:0)

我遗憾的是目前没有代码,但这就是你如何解决这个问题的原因(并且很可能已经有了解决方案)。

您可以创建一个新的appender,以异步方式记录到您的文件/控制台。

在appender中,您可以自己实现聚合。每当一个logevent进来,而不是立即写出来,检查你以前是否看过这个消息。如果你这样做,而不是记录它,增加你的计数器。

最终,将这些聚合日志事件转换为聚合消息并处理该消息而不是千个日志事件。

这可以通过异步appender基础上的第二个工作程序来解决(例如)。通常(我正在看锁定,但我认为它对你来说非常相似),异步appender最终将事件添加到队列中,该队列将由不同于该队列的线程处理。

您可以为聚合消息设置不同的队列,并且每隔5秒运行一个工作人员。如果在这5秒内多次看到相同的消息,您的工作人员可以聚合该消息并将其放在要处理的队列中,以便最终在日志中结束。

我希望有所帮助,

阿图尔

P.S。:关于您的配置,只需将Console appender替换为您的自定义聚合appender即可。如果你想要控制台,只需扩展那个appender并让它做你想做的事情:)

答案 1 :(得分:0)

当然可以创建一个执行此操作的log4j2插件,但我认为日志库不是解决此问题的最佳位置。

我认为如果在您的应用程序中您跟踪您记录的上一条消息,我将会得到更简单的代码。如果下一条消息相同,则不要记录,而是递增计数器。当您点击其他消息时,您会记录计数器值。

(通过Dequeue跟踪多条消息可以更加通用。)