Log4j2 Asynclogger没有记录完整数据

时间:2014-06-14 01:20:29

标签: log4j2

以下是我的配置。每当我运行代码时,最后都会丢失许多错误日志。 这是Asynclogger的问题吗?我使用的是2.0-rc1。

<Configuration>
<Appenders>
<RollingFile name="APP.ALERT" 
  fileName="C:\Users\sbasheer\Downloads\splunklogs\Alert.log" 
  filePattern="C:\Users\abc\Downloads\abclogs\Alert%d{MM-dd-yyyy}-%i.log">
  <PatternLayout>
    <Pattern>%d | %5p %t %n %X{eventUUID} %c:%M(%L) : %m %n</Pattern>
  </PatternLayout>
  <Policies>
    <TimeBasedTriggeringPolicy />
    <SizeBasedTriggeringPolicy size="25 MB"/>
  </Policies>
  <DefaultRolloverStrategy max="50"/>
</RollingFile>
<Console name="STDOUT" target="SYSTEM_OUT">
  <PatternLayout pattern="%d %-5p [%t] %c{2} - %m%n" />
</Console>
</Appenders>
<Loggers>
<AsyncLogger name="com.abc.asyncsample"  level="trace" includeLocation="true"> 
  <AppenderRef ref="APP.ALERT" level="error"/>
</AsyncLogger>
<Root level="info" includeLocation="true">
  <AppenderRef ref="STDOUT"/>
</Root>
</Loggers>
</Configuration>

代码:

for(int i=0;i<100000;i++)
{
    logger.error("Error::" + i);
}

1 个答案:

答案 0 :(得分:0)

我尝试使用上面的(修补)配置重现问题,但它运行正常。我在控制台和文件中都看到了日志,两个目标中的最终日志条目都按预期显示“Error :: 99999”。

当您说“最后缺少许多错误日志”时,您看到的最后一个条目是什么?此外,示例代码未显示,是使用LogManager.getLogger(“com.abc.asyncsample”)创建的记录器吗? (或者使用“com.abc.asyncsample”包中的类,那也没关系?)

我注意到您有一个基于大小的翻转策略,配置为25MB。如果您运行上述示例代码三次,文件大小将超过25MB,并在“Error :: 94918”(在Windows PC上)周围触发翻转。在翻转之后,Alert.log文件将按预期包含剩余的条目“Error :: 94919”到“Error :: 99999”。

是不是你看到翻滚结果并错误地断定事件被删除了?


更新:

我正在测试干线,这就是为什么我无法重现这个问题。这是rc1(LOG4J2-392 / LOG4J2-520)的已知问题,已在主干中修复。修复程序将在下一个版本(rc2)中。

本质上,这是log4j2-rc1的关闭序列中的问题,其中Appender在Logger队列完全耗尽之前与其Logger断开连接。作为一种解决方法,您可以在退出之前使应用程序休眠一段时间。