【问题标题】:How to verify log4j2 is logging asynchronously via LMAX disruptor?如何验证 log4j2 是否通过 LMAX 中断器异步记录?
【发布时间】:2016-01-22 10:36:49
【问题描述】:

我正在开发一个 Eclipse RCP 应用程序,并且为了让 log4j2 在应用程序中工作而付出了一些努力。现在似乎一切正常,作为画龙点睛的一笔,我想制作all loggers asynchronously

我已经设法在类路径中获得 LMAX Disruptor,并且认为我已经解决了提供 sun.miscissue 问题。在运行配置中设置 VM 参数 -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector 并正确设置 log4j2.xml 文件。 我认为。这就是问题所在。我希望能够验证我的应用程序是否以适当的方式异步记录,这样我就可以享受延迟方面的好处。

然后,我如何验证我的记录器是否在异步工作,在此过程中使用 LMAX Dirsuptor?

【问题讨论】:

  • 你得到日志输出了吗?
  • 我愿意。我只是不确定它应该以它应该的方式降落在那里:异步。而且我已经不再盲目信任 Eclipse/OSGi 黑魔法 ;)。
  • 顺便说一句,如果您已经解决了在您的 Eclipse 插件中提供sun.misc 的问题,您介意回答您链接到的问题吗?
  • @RemkoPopma:会的。作为新手,我仍然对一切正常工作感到惊讶。

标签: java asynchronous logging log4j log4j2


【解决方案1】:

有两种类型的异步记录器,由不同的类处理。

  1. 所有记录器异步:AsyncLogger 类 - 在您使用 AsyncLoggerContextSelector 时激活
  2. 将同步与异步记录器混合使用:AsyncLoggerConfig 类 - 当您的配置文件在 <Loggers> 的配置中嵌套了 <AsyncRoot><AsyncLogger> 元素时。

在您的情况下,您正在使所有记录器异步,因此您希望将断点放在AsyncLogger#logMessage(String, Level, Marker, Message, Throwable)

另一种验证方法是在配置文件的顶部设置<Configuration status="trace">。这将在配置 log4j 时输出内部 log4j 日志消息。您应该会看到类似“正在启动 AsyncLogger 中断器...”的内容。如果您看到这一点,所有记录器都是异步的。

【讨论】:

  • 设置<Configuration status="trace"> 成功了,谢谢!应该更仔细地阅读the docs!设置配置状态后,我得到2015-10-27 10:13:21,847 DEBUG Starting AsyncLogger disruptor with ringbuffer size 262144...。太好了!
  • 重要提示:这个答案似乎只是部分正确。断点方法有效,但<Configuration status="trace"> 方法无效。使用后者,当我指定 -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector 标志和不指定时,我都会得到 Starting AsyncLogger disruptor... 日志。使用断点,我看到在一种情况下(使用标志),异步记录器确实被命中,而在另一种情况下,它们没有。
  • @JanŻankowski 在 JRE 8u102 中使用 Disruptor 3.3.5 运行 Log4j 2.5 时,我看到了完全不同的结果。我从来没有看到任何带有“破坏者”一词的日志语句。但是,如果我成功地将所有记录器设置为异步运行,我确实会看到一堆包含文本“AsyncLogger”和“AsyncContext”的日志语句。此外,删除中断库会导致应用程序在尝试异步运行所有记录器时崩溃。
  • @RaemkoPopma 有没有办法可以同步 ERROR 并异步所有其他日志类型?
  • 我可以在使用跟踪时看到 AyncLogger 并检查异步功能我试图循环 Logger.info 100000 时间,在循环后的下一个语句中我试图创建一个文件,但是在日志写入完成之前不会创建文件,我是否设置了错误的期望?
【解决方案2】:

org.apache.logging.log4j.core.async.AsyncLoggerConfig#callAppenders 中放置一个断点。然后您可以观看事件被放入干扰器中。同样,org.apache.logging.log4j.core.config.LoggerConfig#callAppenders 应该受到同步日志记录的影响,或者从中断器的另一侧受到异步日志记录的影响(此时一切都再次同步)。

【讨论】:

  • 即使我通过 log4j2.xml 配置也会调用该断点吗?我已经在 Eclipse 中附加了源代码并设置了断点,但执行并没有停止。
  • 我相信没关系。在org.apache.logging.log4j.core.config.LoggerConfig#callAppenders 中设置另一个断点。这应该只会在破坏者的“另一边”受到打击。如果它直接从您的记录器中被击中,那么它就不起作用了。
  • 这几乎但并不完全正确。当所有记录器都是异步的(配置了AsyncLoggerContextSelector 时),不使用AsyncLoggerConfig 类。有关详细信息,请参阅我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多