问题 如何验证log4j2是通过LMAX disruptor异步记录的?


我正在开发一个Eclipse RCP应用程序,并且已经努力让log4j2在应用程序中工作。一切似乎现在都很好,并且作为我想做的画龙点睛 所有记录器异步

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

我怎么能 - 然后 - 在过程中利用LMAX Dirsuptor验证我的记录器是否异步工作?


4919
2017-10-23 00:35


起源

你得到日志输出? - Sotirios Delimanolis
我做。我只是不确定它应该如何落在那里:异步。而且我已经过去对Eclipse / OSGi黑魔法的盲目信任;)。 - s.d
顺便说一句,如果你已经解决了提供的问题 sun.misc 在你的Eclipse插件中,你介意回答你链接的问题吗? - Remko Popma
@RemkoPopma:会的。仍然感到惊讶,我得到了一切正常工作,就像新手一样。 - s.d
@RemkoPopma: stackoverflow.com/a/33379935/731040。 - s.d


答案:


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

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

在你的情况下,你正在使所有记录器异步,所以你想把你的断点 AsyncLogger#logMessage(String, Level, Marker, Message, Throwable)

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


11
2017-10-27 04:07



设置 <Configuration status="trace"> 做了诀窍,谢谢!应该读一读 文档 更仔细!设置完配置状态后,我明白了 2015-10-27 10:13:21,847 DEBUG Starting AsyncLogger disruptor with ringbuffer size 262144...。大! - s.d
重要提示:这个答案似乎只是部分正确。断点方法有效,但是 <Configuration status="trace"> 方法没有。使用后者,我得到了 Starting AsyncLogger disruptor... 我指定时记录两者 -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector 国旗,当我不。使用断点,我看到在一种情况下(带有标志),异步记录器确实被击中,而在另一种情况下,它们不是。 - Jan Żankowski
@JanŻankowski在JRE 8u102中使用Disruptor 3.3.5运行Log4j 2.5时,我看到完全不同的结果。我从来没有看到任何带有“disruptor”一词的日志声明。但是,如果我成功地将所有记录器设置为异步运行,我会看到一堆包含文本“AsyncLogger”和“AsyncContext”的日志语句。此外,在尝试异步运行所有记录器时,删除disruptor库会导致应用程序崩溃。 - Jeff G


放入一个断点 org.apache.logging.log4j.core.async.AsyncLoggerConfig#callAppenders。然后你可以看到事件被放入破坏者。同样 org.apache.logging.log4j.core.config.LoggerConfig#callAppenders 应该被同步日志记录命中,或者从异常日志记录的另一端受到攻击(此时所有内容都是同步的)。


3
2017-10-23 00:54



即使我通过log4j2.xml配置,也会调用该断点吗?我已经在Eclipse中附加了源代码并设置了断点,但执行并没有停止。 - s.d
我相信这应该没关系。设置另一个断点 org.apache.logging.log4j.core.config.LoggerConfig#callAppenders。这只应该在破坏者的“另一面”受到打击。如果它直接从你的记录器中被击中,那么它就不起作用了。 - mvd
这几乎是不正确的。该 AsyncLoggerConfig 所有记录器都是异步的时候不使用class(当时 AsyncLoggerContextSelector 已配置)。有关详细信息,请参阅我的回答 - Remko Popma