如何验证 log4j2 是否通过 LMAX disruptor 异步记录?

How to verify log4j2 is logging asynchronously via LMAX disruptor?

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

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

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

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

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

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

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

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