Log4j2 RollingFile appenders发生冲突

时间:2016-10-07 09:25:38

标签: log4j2

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>

1 个答案:

答案 0 :(得分:2)

我不知道为什么你认为这应该有效。您有两个appender尝试写入同一个文件,尝试根据不同的标准进行翻转并翻转到具有不同名称的文件。因为有两个东西一次打开,所以你得到文件正在使用中就不足为奇了。