我使用Log4J2“使所有记录器异步”部分,设置:
-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector.
https://logging.apache.org/log4j/2.x/manual/async.html
我处理大量日志,然后在退出之前停止附加程序:
org.apache.logging.log4j.core.Logger coreLogger = (org.apache.logging.log4j.core.Logger) logger;
org.apache.logging.log4j.core.LoggerContext context = (org.apache.logging.log4j.core.LoggerContext) coreLogger.getContext();
Map<String, Appender> appenders = context.getConfiguration().getAppenders();
for (Appender appender : appenders.values()) {
appender.stop();
}
通过这样做,我希望它将刷新异步附加器,并在我退出程序之前将剩余的日志写入磁盘。
但事情是这样的:
2015-05-19 14:09:58,540 ERROR Attempted to append to non-started appender myFileAppender
Exception in thread "AsyncLogger-1" java.lang.RuntimeException: org.apache.logging.log4j.core.appender.AppenderLoggingException: Attempted to append to non-started appender myFileAppender
at com.lmax.disruptor.FatalExceptionHandler.handleEventException(FatalExceptionHandler.java:45)
at com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:147)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.logging.log4j.core.appender.AppenderLoggingException: Attempted to append to non-started appender myFileAppender
at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:89)
at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:430)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:409)
at org.apache.logging.log4j.core.Logger$PrivateConfig.logEvent(Logger.java:288)
at org.apache.logging.log4j.core.async.AsyncLogger.actualAsyncLog(AsyncLogger.java:305)
at org.apache.logging.log4j.core.async.RingBufferLogEvent.execute(RingBufferLogEvent.java:100)
at org.apache.logging.log4j.core.async.RingBufferLogEventHandler.onEvent(RingBufferLogEventHandler.java:43)
at org.apache.logging.log4j.core.async.RingBufferLogEventHandler.onEvent(RingBufferLogEventHandler.java:28)
at com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:128)
... 3 more
因此,关闭看起来不像是实际刷新,记录器最终失败。
我的会议:
<Configuration>
<Appenders>
<RollingFile name="myFileAppender" fileName="/tmp/test.log" ignoreExceptions="false" immediateFlush="false">
<PatternLayout><Pattern>%m%n</Pattern></PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
</Policies>
</RollingFile>
<Console name="STDOUT">
<PatternLayout pattern="%C{1.} %m %level MDC%X%n"/>
</Console>
</Appenders>
<Loggers>
<Logger name="myLogger" level="info" additivity="false">
<AppenderRef ref="myFileAppender" />
</Logger>
<Root level="fatal">
<AppenderRef ref="STDOUT"/>
</Root>
</Loggers>
</Configuration>
如何刷新/同步log4j2?
Log4j2有一个关闭钩子(对于非web应用程序),负责等待后台线程处理队列中的任何事件。因此,最好的办法是不要在appender仍在使用时停止它们。让log4j2负责清理。
要完全停止异步记录器,可以调用org。阿帕奇。登录中。log4j。果心异步的。异步记录器。停止()
。这会一直阻止,直到刷新所有消息。注意:
-DLog4jContextSelector=org。阿帕奇。登录中。log4j。果心异步的。AsyncLoggerContextSelector
我想让一些记录器异步在log4j2.properties文件。在xml格式中,您可以添加为 我在log4j2中试过了。作为记录器的属性=com foo Bar 但这种语法似乎是错误的。 正确的配置方法是什么?
我最近升级了我的应用程序以使用log4j2。我正在尝试利用它的异步记录器特性。然而,看起来它并没有创建一个。根据Log4j异步配置,它说, 要使所有记录器都是异步的,请将中断器jar添加到类路径中,并将系统属性Log4jContextSelector设置为org.apache.logging.log4j.core.async.AsyncloggerContextSelector。我还设置了log4
我正在尝试设置log4j2以使用异步记录器将所有消息记录到滚动文件中。 是否有一种方法可以创建另一个记录程序来捕获所有事件?还有别的想法吗? 下面是我的log4j2.xml:
背景: 在log4j2中,当使用asyncappender时,您可以将记录器的参数“blocking”设置为false,以便丢弃溢出缓冲区大小的任何日志,而不会减慢主线程的速度。(请参见asyncAppender下的此处。)https://logging.apache.org/log4j/2.x/manual/appenders.html) 我正在将我们的应用程序升级到这里找到的辉煌的asyncL
基于https://logging.apache.org/log4j/2.x/manual/async.html我想使用混合同步和异步记录器的方法,以便从所有同步记录器的性能改进中获益。 基准代码: Log4j2配置正是文档中的配置(https://logging.apache.org/log4j/2.x/manual/async.html): 使用这种混合的同步/异步记录器配置,我可以每秒获得大
使用log4j2,我很难让同步记录器和异步记录器一起工作。 从这里以Apache文档(标题为混合同步和异步记录器)为例,运行下面的应用程序将简单地创建日志文件,但不向其写入任何内容。我也不确定添加两个记录器指向同一个appender,但它的Apache留档,所以我假设这是好的。 LOG4J2配置 pom.xml 应用 但是,如果我更改log4j2配置并修改loggers元素以读取以下内容,我将在日