【问题标题】:Log4j2 RollingFile appenders clashingLog4j2 RollingFile appenders 冲突
【发布时间】:2017-02-16 06:06:26
【问题描述】:

Log4j2 RollingFile appenders 冲突

以下是我们的 log4j2 配置文件的简化调试版本(我们不是每分钟每晚滚动一次!)。
此配置,而不是每分钟创建一个滚动文件
(根据 TimeBasedTriggeringPolicy)将创建一个翻转文件(非 tarred),包含 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 附加程序,那么 timeBasedRollingFileJsonLayout 附加程序将按预期工作。

对于不同的环境,我们有两个不同的附加程序,其中日志可能会或可能不会连接到 ELK。
在我们真正的 log4j2 配置文件中,我们使用属性来为环境选择合适的附加程序。
为清楚起见,我已从该文件中删除了这些属性,并将它们排除为问题的可能原因。

我们正在使用 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>

【问题讨论】:

    标签: log4j2


    【解决方案1】:

    我不明白为什么你认为这应该有效。您有两个附加程序试图写入同一个文件,试图根据不同的条件翻转并翻转到具有不同名称的文件。您收到文件正在使用错误也就不足为奇了,因为它同时打开了两件事。

    【讨论】:

    • 嗨@rgoers。我认为因为记录器只引用了一个附加器,所以只有那个附加器会处于活动状态。从您所说的来看,我认为 AppenderRef 只是用于将 Logger 引导到特定的 appender 并且所有 appender 都处于活动状态,无论它们是否被 Logger 引用,我是否正确?如果是这样,那么使用 RoutingAppender 可能是我需要的吗?
    • 是的,如果你需要动态的 Appender 创建,那么 RoutingAppender 会做。 Log4j2 2.7 刚刚还引入了一个 ScriptAppenderSelector 可能更适合您的需求。
    • 谢谢@rgoers。这看起来像我需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多