首页 > 解决方案 > 如何配置 Log4j2 以快速滚动日志文件?

问题描述

我有一些日志文件,我想每天滚动并归档到 gzip 中。

相关配置如下所示:

<Appenders>
    <RollingFile name="MyLog"
                 fileName="${sys:log.dir}/mylog.log"
                 filePattern="${sys:log.dir}/mylog-%d{yyyy-MM-dd}.log.gz">
        <PatternLayout pattern="%d %p | %m | %c{1.} [%t]%n"/>
        <Policies>
            <TimeBasedTriggeringPolicy/>
        </Policies>
    </RollingFile>
</Appenders>

<Loggers>
    <Root level="INFO">
        <AppenderRef ref="MyLog"/>
    </Root>
</Loggers>

所以日志目录可能看起来像

mylog-2020-01-01.log.gz
mylog-2020-01-02.log.gz
mylog-2020-01-03.log.gz
mylog.log  // todays logs (let's say its the 4th Jan)

这工作正常,除了日志文件在一天结束时没有急切地压缩,只要附加第二天的第一个日志语句,它就会延迟压缩。

由于我正在记录的内容的性质(与客户端会话相关),这可能要到午夜之后才会发生。可能是几个小时,甚至几天。

ls能够找到我感兴趣的日期的日志目录中的文件会很方便。目前,我不能可靠地做到这一点,因为昨天的日志可能还没有滚动;在那种情况下mylog.log不是今天的日志,而是昨天的日志。

有没有办法配置它,以便它会急切地滚动文件,而不是懒惰?

我可以添加一个 cronjob 来进行清理,但我很犹豫,因为如果在午夜左右进行日志记录,我不想弄乱 log4j 试图写入的文件。似乎很容易出错。

标签: javalog4j2

解决方案


看起来问题是TimeBasedTriggeringPolicy

一旦日期/时间模式不再适用于活动文件TimeBasedTriggeringPolicy就会导致翻转

似乎基于 cron 的策略对我有用

触发器基于CronTriggeringPolicycron 表达式翻转。此策略由计时器控制,并且与处理日志事件异步,因此上一个或下一个时间段的日志事件可能出现在日志文件的开头或结尾

附加器参考

每天午夜执行:

<Policies>
    <CronTriggeringPolicy schedule="0 0 0 * * *"/>
</Policies>

推荐阅读