首页 > 解决方案 > 如何让 Log4j2 RollingFileAppender 创建新的日志文件并滚动现有文件

问题描述

如何配置 log4j2(当前使用 V2.13.3)以在每次应用启动时创建一个新的日志文件,并滚动任何现有文件,最多 10 个文件?

例如,应用程序第一次运行它会创建test.log. 第二次运行现有的test.log会被重命名,并且应用程序开始记录到新的test.log. 等等。

我尝试了以下配置:

<Configuration>
    <Appenders>
        <RollingFile
                name="file"
                fileName="test.log"
                filePattern="test-%d{yyyyMMdd-HHmmss}-%i.log"
                append="false">
            <PatternLayout pattern="%d{yyyy-MM-dd'T'HH:mm:ss.SSS} [%c{2}] [%t]%n[%p] : %m%n"/>
            <OnStartupTriggeringPolicy minSize="1"/>
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="file"/>
        </Root>
    </Loggers>
</Configuration>

然而,滚动的日志文件永远不会被创建——log4j2 只是test.log每次都保持覆盖。我的猜测是 log4j2 在调用 OnStartupTriggeringPolicy 之前创建新的日志文件,因此策略确定不需要滚动日志文件。AFAICS 这似乎是一个错误。

如果我将append="false"标志更改为append="true",则创建滚动文件,但是第一次运行应用程序时,它会同时创建test.logtest-yyyymmdd-hhmmss-1.log文件(后者为空),并且对于每次后续运行,它都会使用原始文件名创建滚动文件test-yyyymmdd-hhmmss-n.log,例如:

test-20200715-120227-1.log
test-20200715-120227-2.log
test-20200715-120227-3.log

(我希望每个滚动文件都有不同的 hhmmss 时间)。

奇怪的是,如果(保留append="true")我在滚动的日志文件名中添加了一个.gz后缀,则:

filePattern="test-%d{yyyyMMdd-HHmmss}-%i.log.gz"

比我得到想要的行为:

test-20200715-143142-1.log.gz
test-20200715-143149-1.log.gz
test-20200715-143153-1.log.gz

标签: javalogginglog4jlog4j2

解决方案


OnStartupTriggerPolicy 应该在 Policies 标签下

<Policies> <OnStartupTriggeringPolicy minSize="1"/> </Policies>

我会尝试这样的事情:

<Configuration>
    <Appenders>
        <RollingFile
                name="file"
                fileName="test.log"
                filePattern="test-%d{yyyyMMdd-HHmmss}-%i.log"
                append="false"
                bufferedIO="false"
        >
            <PatternLayout> 
                <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS} [%c{2}] [%t]%n[%p] : %m%n
                </Pattern>
            </PatternLayout>
            <Policies>
                <OnStartupTriggeringPolicy minSize="1"/>
            </Policies>
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="file"/>
        </Root>
    </Loggers>
</Configuration>

推荐阅读