我正在开发一个Eclipse RCP应用程序,并且已经付出了一些努力让log4j2在应用程序中运行。现在一切似乎都很好,作为画龙点睛,我想制作all loggers asynchronously。
我已经设法在类路径上获得LMAX Disruptor,并认为我已经解决了提供sun.misc
的{{3}}。在运行配置中设置VM参数-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
,并正确设置 log4j2.xml 文件。 我认为。这就是问题所在。我希望能够以正确的方式验证我的应用程序以异步方式记录,因此我可以享受延迟方面的好处。
如何 - 然后 - 在此过程中使用LMAX Dirsuptor验证我的记录器是否异步工作?
答案 0 :(得分:12)
有两种类型的异步记录器,由不同的类处理。
AsyncLogger
类 - 使用AsyncLoggerContextSelector
时激活AsyncLoggerConfig
类 - 当您的配置文件<AsyncRoot>
或<AsyncLogger>
元素嵌套在<Loggers>
的配置中时。在您的情况下,您将使所有记录器异步,因此您希望将断点放在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
应该被同步日志记录命中,或者从异常日志记录的另一端被命中(此时所有内容都是同步的)。