以下是我的配置。每当我运行代码时,最后都会丢失许多错误日志。 这是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);
}
答案 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断开连接。作为一种解决方法,您可以在退出之前使应用程序休眠一段时间。