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

如何在log4j2中抑制重复消息

秦禄
2023-03-14

我对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个答案

邰昀
2023-03-14

当然可以创建一个log4j2插件来实现这一点,但我认为日志库并不是解决这一问题的最佳场所。

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

(这可以通过出列来跟踪多条消息而变得更通用。)

尤俊誉
2023-03-14

遗憾的是,我目前没有代码,但这就是你可以解决这个问题的方法(很可能已经有了一个解决方案)。

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

在appender中,您可以自己实现聚合。每当logevent出现时,不要立即将其写出来,而是检查您以前是否看到过该消息。如果这样做了,则增加计数器,而不是记录它。

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

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

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

我希望这能有所帮助,

阿图尔

 类似资料:
  • 问题内容: 我一直在四处寻找,但还没有找到如何执行此操作的方法(尽管在分析其性能方面发现了很多内容!!) 我想执行一次选择,该操作返回几列数据,然后返回另一个表中的相关行的嵌套表(实际上是同一张表本身连接在一起,但我认为这是无关紧要的)。 所以数据是这样的: 这个想法是执行选择,以查找所有可能与注册帐户相关的未注册人员。 所以结果看起来像 我可以使用SQL来处理所有选择条件,并且有一个查询返回可以

  • 问题内容: 我该如何告诉Maven对无法在其中找到依赖项的存储库隐藏“无法找到资源” INFO消息,但显示那些确实找到依赖项的存储库呢?也就是说,显示匹配,但忽略未命中,因为这些淹没并模糊了匹配。 例如,代替此输出: 我希望Maven仅输出以下内容: 问题答案: 我不知道从Maven内部做什么,但是您总是可以将输出通过管道传递给grep或sed之类的进程,以删除每个模式的行数。

  • 嘿,我想知道控制台中的输出是否可能与文件输出中的输出相同。 这是我的XML配置。 滚动文件中的输出 在控制台中为空。但是现在如果我改变 到"追踪" 将是2,4,6。。。。在控制台和我的文件中,它将是1,3,5,7。。。这很容易理解。 但是我的问题是,我们如何在控制台和文件中同时拥有相同的日志级(跟踪)输出?(添加包名称和级别的标签不起作用) 与此问题相关: log4j2 xml配置-登录到文件和控

  • 我希望所有测试用例的TestNG报告中都有Log4j2日志信息。 TestNG使用一个名为Reporter.java的特殊记录器类来跟踪日志输出,并将其保存在结果XML中。 在log4j中,可以简单地创建一个appender实现,路由到Reporter并注册它。 使用Log4j2中的新loggerapi,很难找到有关如何实现这一点的信息。我有一些信息可以使用Log4j完成这项工作,但不能使用Log

  • 问题内容: 每次我都会收到警告: 抑制它的最佳方法是什么?所有软件包都是最新的。 Conf: OSX带有Brew Python 2.7.10(默认,2015年7月13日,12:05:58),pandas == 0.17.0和matplotlib == 1.5.0 问题答案: 您可以禁止所有警告:

  • 我试图使用抑制过滤器,但发生意外错误。 以下是一条错误消息。 无法初始化模块SuppressionFilter-无法将模块SuppressionFilter中的属性“file”设置为“checkstyle suppressions.xml”:无法找到checkstyle-suppressions.xml-文档根元素“suppressions”,必须与DOCTYPE root“module”匹配 你