Java 如何验证log4j2是否通过LMAX中断器异步记录?
我正在开发一个EclipseRCP应用程序,为了让log4j2在该应用程序中工作,我付出了一些努力。现在一切似乎都很顺利,作为最后的润色,我想做一个 我已经在类路径上找到了LMAX干扰程序,并且认为我已经解决了提供Java 如何验证log4j2是否通过LMAX中断器异步记录?,java,asynchronous,logging,log4j,log4j2,Java,Asynchronous,Logging,Log4j,Log4j2,我正在开发一个EclipseRCP应用程序,为了让log4j2在该应用程序中工作,我付出了一些努力。现在一切似乎都很顺利,作为最后的润色,我想做一个 我已经在类路径上找到了LMAX干扰程序,并且认为我已经解决了提供sun.misc的问题。在运行配置中设置VM参数-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector,并正确设置log4j2.xml文件我想。这就是问题所在。我希望能够
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
应该被用于同步日志记录,或者从中断器的另一端被用于异步日志记录(此时一切都再次同步)。有两种类型的异步日志记录程序,由不同的类处理
AsyncLoggerContextSelector
或
元素时,异步记录器配置
类AsyncLogger\logMessage(字符串、级别、标记、消息、可丢弃)
中
另一种验证方法是在配置文件顶部设置
。这将在配置log4j时输出内部log4j日志消息。您应该看到类似“启动AsyncLogger disruptor…”的内容。如果您看到这一点,所有记录器都是异步的。您是否得到日志输出?我得到。我只是不确定它是否以它应该的方式到达那里:异步。我不再盲目信任Eclipse/OSGi黑魔法;)。顺便问一下,如果您已经解决了在Eclipse插件中提供sun.misc
的问题,您是否介意回答您链接到的问题?@RemkoPopma:Will。作为一个新手,我仍然很惊讶所有的东西都能正常工作。@RemkoPopma:。即使我通过log4j2.xml进行配置,也会调用该断点吗?我已经在Eclipse中附加了源代码并设置了断点,但是执行不会停止。我相信这不重要。在org.apache.logging.log4j.core.config.LoggerConfig#callAppenders
中设置另一个断点。这应该只在破坏者的“另一边”被击中。如果它直接从你的记录器中被击中,那么它就不工作了。这几乎是正确的,但并不完全正确。当所有记录器都是异步的(当配置了AsyncLoggerContextSelector
时),不使用AsyncLoggerConfig
类。查看我的答案了解更多详细信息。设置
成功,谢谢!你应该仔细读一读!设置配置状态后,我得到2015-10-27 10:13:21847调试启动AsyncLogger disruptor,环缓冲区大小262144…
。伟大的重要提示:这个答案似乎只是部分正确。断点方法有效,但
方法无效。使用后者,当我指定-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
标志时和不指定时,我都会得到启动AsyncLogger disruptor…
日志。通过使用断点,我发现在一种情况下(使用该标志),异步记录器确实被命中,而在另一种情况下,它们没有被命中。@JanŻankowski在JRE 8u102中使用Disruptor 3.3.5运行Log4j 2.5时,我看到了完全不同的结果。我从未看到任何日志语句中有“disruptor”一词。但是,如果我成功地将所有记录器设置为异步运行,我会看到一组日志语句,其中包含文本“AsyncLogger”和“AsyncContext”。此外当尝试异步运行所有日志记录程序时,删除中断程序库会导致应用程序崩溃。@RaemkoPopma有没有办法同步错误并每其他日志类型异步一次?我可以在使用跟踪时看到AyncLogger,并在下一条语句中检查异步功能,我正在尝试循环Logger.info 100000次在循环之后,我尝试创建一个文件,但直到日志写入完成才创建文件,我是否设置了错误的期望值?