我正在开发一个Eclipse RCP应用程序,并且已经努力让log4j2在应用程序中工作。一切似乎现在都很好,并且作为我想做的画龙点睛 所有记录器异步。
我已经设法在类路径上获得LMAX Disruptor,并认为我已经解决了 问题 提供 sun.misc
同样。设置VM参数 -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
在运行配置和设置 log4j2.xml 文件也正确。 我认为。这就是问题所在。我希望能够验证我的应用程序以正确的方式异步记录,因此我可以享受延迟方面的好处。
我怎么能 - 然后 - 在过程中利用LMAX Dirsuptor验证我的记录器是否异步工作?
有两种类型的异步记录器,由不同的类处理。
- 所有记录器异步:
AsyncLogger
class - 使用时激活 AsyncLoggerContextSelector
- 将同步与异步记录器混合:
AsyncLoggerConfig
class - 当你的配置文件有 <AsyncRoot>
要么 <AsyncLogger>
嵌套在配置中的元素 <Loggers>
。
在你的情况下,你正在使所有记录器异步,所以你想把你的断点 AsyncLogger#logMessage(String, Level, Marker, Message, Throwable)
。
另一种验证方法是设置 <Configuration status="trace">
在配置文件的顶部。这将在log4j上配置输出内部log4j日志消息。您应该看到类似“启动AsyncLogger disruptor ...”的内容。如果您看到所有记录器都是异步的。
放入一个断点 org.apache.logging.log4j.core.async.AsyncLoggerConfig#callAppenders
。然后你可以看到事件被放入破坏者。同样 org.apache.logging.log4j.core.config.LoggerConfig#callAppenders
应该被同步日志记录命中,或者从异常日志记录的另一端受到攻击(此时所有内容都是同步的)。