Log4j2 在指定时间后自动滚动

Xav*_*uza 6 java logging log4j log4j2

我正在使用 RollingFile 附加程序。我希望日志文件每 20 分钟滚动一次,无论日志记录事件如何。例如,在一小时内我应该有 3 个日志文件,即使在那一小时内可能没有任何日志记录。使用 Log4j2 可以吗?如果是,请提供所需的配置(在 log4j2.xml 中)。以下配置似乎不起作用:

       <RollingFile name="RECHARGE_NMCD" fileName="D:/rc_nmcd/rc_nmcd.log" append="true" bufferedIO="false" filePattern="D:/rc_nmcd/rc_nmcd_%d{yyyy-MM-dd-HH-mm}.process">
            <PatternLayout>
                <Pattern>%m%n</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="20"/>
            </Policies>
            <DefaultRolloverStrategy max="20" />
        </RollingFile>
Run Code Online (Sandbox Code Playgroud)

Hun*_*NM2 5

将第二个单元的filePattern 更改为 %d{yyyy-MM-dd_HH-mm- ss }

\n

%d{yyyy-MM-dd_HH- mm } 为分钟单位

\n

%d{yyyy-MM-dd_ HH } 为小时单位

\n

%d{yyyy-MM- dd } 是天单位

\n

log4j2.xml:

\n
<?xml version="1.0" encoding="UTF-8"?>\n<Configuration status="WARN" >\n    <Properties>\n        <Property name="LOG_PATTERN_7">%d{yyyy/MM/dd HH:mm:ss.SSS} [%-6p] %c.%M(%F:%L) \xe2\x80\x93 %m%n</Property>\n    </Properties>\n\n    <Appenders>\n        <RollingFile name="RollingFile" fileName="logs/app.log" \n            filePattern="logs/$${date:yyyy-MM-dd}/${env:APP_NAME:-app}-%d{yyyy-MM-dd_HH-mm}_%i.log.zip">\n            <PatternLayout pattern="${LOG_PATTERN_7}" />\n            <Policies>\n                <!-- filePattern %d{yyyy-MM-dd_HH-mm-ss}: interval = 20 second -->\n                <!-- filePattern %d{yyyy-MM-dd_HH-mm}: interval = 20 minutes -->\n                <!-- filePattern %d{yyyy-MM-dd_HH}: interval = 20 hours -->\n                <TimeBasedTriggeringPolicy interval="20" modulate="true"/>\n            </Policies>\n            <DefaultRolloverStrategy max="1000" />\n        </RollingFile>\n\n        <Console name="Console" target="SYSTEM_OUT" follow="true">\n            <PatternLayout pattern="${LOG_PATTERN_7}" />\n        </Console>\n    </Appenders>\n\n    <Loggers>\n        <Root level="all" includeLocation="true">\n            <AppenderRef ref="Console" />\n            <AppenderRef ref="RollingFile" />\n        </Root>\n    </Loggers>\n\n</Configuration>\n
Run Code Online (Sandbox Code Playgroud)\n


Xav*_*uza 0

我提到了这个插件https://github.com/mushkevych/log4j2plugin

我每个 FTimeBasedTriggeringPolicy 有一个可运行线程,它实际上会休眠到下一次翻转,而不是 LogRotateThread 休眠一些不确定的指定时间。

Thread rotateThread = new Thread(new LogRotateRunnable(this));
rotateThread.start();
Run Code Online (Sandbox Code Playgroud)


初始化后添加上述内容(RollingFileManager)

日志旋转可运行:

while (true) {
        long sleepTime = fTimeBasedTriggeringPolicy.getNextRollover()
                - System.currentTimeMillis();
        if (sleepTime > 0) {
            try {
                Thread.sleep(sleepTime + EMPTY_LOG_EVENT_DELAY);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        fTimeBasedTriggeringPolicy.checkRollover(new EmptyLogEvent());
    }
Run Code Online (Sandbox Code Playgroud)


此外,它不会滚动空文件,但好的一点是,如果在下一个滚动时间内至少有一个有效的日志条目,它就会滚动。