Log4j2 RollingFile appenders发生冲突
下面是我们的log4j2配置文件的简化调试版本(我们每晚都要翻转!)。这种配置,而不是每分钟创建一个Rollover文件(根据theTimeBasedTriggeringPolicy)创建一个翻转文件(非涂焦),包含JSON格式的日志记录,每20KB将覆盖一次(尽管最终会略大于20KB(See Screenshot)。
我们还得到以下错误(缩写为“...”): -
2016-10-07 08:47:34,433 default-workqueue-4 ERROR Unable to copy file /.../logs/logFile-2016-10-07-08:47:11.log to /.../logs/logFile-2016-10-07-08:47:11.log: java.nio.file.NoSuchFileException /.../logs/logFile-2016-10-07-08:47:11.log
如果我们切换timeBasedRollingFileJsonLayout appender和sizeBasedRollingFilePatternLayoutWithZippedArchive appender的顺序,那么根本不会发生翻转。
如果我们删除sizeBasedRollingFilePatternLayoutWithZippedArchive appender,那么timeBasedRollingFileJsonLayout appender将按预期工作。
我们为不同的环境提供了两个不同的appender,其中日志可能连接也可能没有连接到ELK。
在我们真正的log4j2配置文件中,我们使用属性为环境选择合适的appender。为了清楚起见,我已从此文件中删除了属性,并将其排除在可能的原因之外。
我们正在使用log4j 2.6.2。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %logger{36} - %msg %n" />
</Console>
<RollingFile name="timeBasedRollingFileJsonLayout" append="true" fileName="logs/logFile.log" filePattern="logs/logFile-%d{yyyy-MM-dd-HH:mm}.log">
<JSONLayout properties="true" compact="true" eventEol="true" />
<Policies>
<TimeBasedTriggeringPolicy />
</Policies>
</RollingFile>
<RollingFile name="sizeBasedRollingFilePatternLayoutWithZippedArchive" append="true" fileName="logs/logFile.log" filePattern="logs/logFile-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %logger{36} - %msg %n" />
<Policies>
<SizeBasedTriggeringPolicy size="20KB" />
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<logger name="logger.one" level="info" additivity="false">
<AppenderRef ref="timeBasedRollingFileJsonLayout" />
</logger>
<Logger name="logger.two" level="info" additivity="false">
<AppenderRef ref="timeBasedRollingFileJsonLayout" />
</Logger>
<Logger name="logger.three" level="info" additivity="false">
<AppenderRef ref="timeBasedRollingFileJsonLayout" />
</Logger>
<Root level="info">
<AppenderRef ref="timeBasedRollingFileJsonLayout" level="all" />
</Root>
</Loggers>
</Configuration>
答案 0 :(得分:2)
我不知道为什么你认为这应该有效。您有两个appender尝试写入同一个文件,尝试根据不同的标准进行翻转并翻转到具有不同名称的文件。因为有两个东西一次打开,所以你得到文件正在使用中就不足为奇了。