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

时间:2015-10-23 00:35:49

标签: java asynchronous logging log4j log4j2

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

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

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

2 个答案:

答案 0 :(得分:12)

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

  1. 所有记录器异步:AsyncLogger类 - 使用AsyncLoggerContextSelector时激活
  2. 将同步与异步记录器混合:AsyncLoggerConfig类 - 当您的配置文件<AsyncRoot><AsyncLogger>元素嵌套在<Loggers>的配置中时。
  3. 在您的情况下,您将使所有记录器异步,因此您希望将断点放在AsyncLogger#logMessage(String, Level, Marker, Message, Throwable)中。

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

答案 1 :(得分:3)

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