繁体   English   中英

如何让 Log4j2 RollingFileAppender 创建新的日志文件并滚动现有文件

[英]How to get Log4j2 RollingFileAppender to create new log file and roll existing files

如何配置 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

OnStartupTriggerPolicy 应该在 Policies 标签下 go

<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>

您的文件名模式中有时间模式,但没有基于时间的翻转策略。 您还有 %i 没有基于大小的翻转策略。 如果没有任何其他策略,onstartup 策略不知道该怎么做,这可能是一个错误,因为它希望存在其他一些策略。 我必须检查一下。

此外,在 DefaultRolloverStrategy 上指定 max=10 不太可能完成任何事情。 该设置意味着“在翻转策略的‘窗口’内只保留 10 个文件”。 如果您有一个基于时间的 24 小时翻转和一个基于大小的翻转导致每天 20 次翻转,那么只有其中的 10 个会被保留。 但是在第 2 天你将有 20 个,在第 3 天你将有 30 个,等等。

我会建议这样的事情:

<Appenders>
    <RollingFile
            name="file"
            fileName="test.log"
            filePattern="test-%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"/>
            <SizeBasedTriggeringPolicy size=50MB"/>
        </Policies>
        <DefaultRolloverStrategy max="10"/>
    </RollingFile>
</Appenders>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM