我是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>
Run Code Online (Sandbox Code Playgroud)
遗憾的是,我目前没有代码,但这就是解决这个问题的方法(而且很可能已经有了解决方案)。
您可以创建一个新的附加程序,该附加程序异步记录到您的文件/控制台。
在appender中,您可以自己实现聚合。每当有日志事件进入时,不要立即将其写出,而是检查您之前是否看过该消息。如果你这样做了,不要记录它,而是增加你的计数器。
最终,将这些聚合日志事件转换为聚合消息并处理该聚合消息,而不是处理数千个日志事件。
例如,这可以通过异步附加程序基础上的第二个工作人员来解决。通常(我正在查看锁回,但我认为它对您来说非常相似),异步附加程序最终会将事件添加到队列中,该队列将由在该队列上工作的不同线程进行处理。
您可以为聚合消息使用不同的队列,以及每 5 秒运行一次的工作线程。如果在这 5 秒内多次看到同一条消息,您的工作人员可以聚合该消息并将其放入要处理的队列中,以便最终记录在日志中。
我希望这有帮助,
阿图尔
PS:关于您的配置,只需将控制台附加器替换为自定义聚合附加器即可。如果您想要控制台,只需扩展该附加程序并使其执行您希望它执行的操作:)