Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何验证log4j2是否通过LMAX中断器异步记录?_Java_Asynchronous_Logging_Log4j_Log4j2 - Fatal编程技术网

Java 如何验证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文件我想。这就是问题所在。我希望能够

我正在开发一个EclipseRCP应用程序,为了让log4j2在该应用程序中工作,我付出了一些努力。现在一切似乎都很顺利,作为最后的润色,我想做一个

我已经在类路径上找到了LMAX干扰程序,并且认为我已经解决了提供
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次在循环之后,我尝试创建一个文件,但直到日志写入完成才创建文件,我是否设置了错误的期望值?