指定时间后 Log4j2 自动翻转

Log4j2 auto rollover after specified duration

我正在使用 RollingFile appender。无论记录事件如何,我都希望每 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>

我不认为您可以开箱即用地让 Log4J2 每 N 分钟滚动一次,看起来您可以让它每分钟、每小时、每天都执行此操作,但不是 20 分钟。 (参见 https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/DailyRollingFileAppender.html - 您可以使用不同的日期模式将其更改为 "every minute")

我没有尝试过这个,但可能有一种方法可以通过提供自定义翻转策略来自定义它...

https://logging.apache.org/log4j/2.x/log4j-core/apidocs/org/apache/logging/log4j/core/appender/rolling/DefaultRolloverStrategy.html

如果可行,请post您的回答以供其他人学习!

试试这个:

<rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>foo.%d{yyyyMMdd-HHmm}.gz</fileNamePattern>
      <cleanHistoryOnStart>true</cleanHistoryOnStart>
      <maxHistory>20</maxHistory>
</rollingPolicy>

而不是

<Policies>
   <TimeBasedTriggeringPolicy interval="20"/>
</Policies>

我引用了这个插件https://github.com/mushkevych/log4j2plugin

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

Thread rotateThread = new Thread(new LogRotateRunnable(this));
rotateThread.start();


在 initialize(RollingFileManager)

之后添加了上面的内容

LogRotateRunnable :

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());
    }


它也不会滚动空文件,但好的部分当然是如果在下一次滚动时间内至少有一个有效的日志条目,它会。

我们可以使用 Corn Expression 策略来做到这一点

CronTriggeringPolicy schedule="0 0/20 * 1/1 * ? *"/>.

这将在每 20 分钟后自动滚动您的文件,无论记录事件如何。

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

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

%d{yyyy-MM-dd_HH}是小时单位

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

log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" >
    <Properties>
        <Property name="LOG_PATTERN_7">%d{yyyy/MM/dd HH:mm:ss.SSS} [%-6p] %c.%M(%F:%L) – %m%n</Property>
    </Properties>

    <Appenders>
        <RollingFile name="RollingFile" fileName="logs/app.log" 
            filePattern="logs/$${date:yyyy-MM-dd}/${env:APP_NAME:-app}-%d{yyyy-MM-dd_HH-mm}_%i.log.zip">
            <PatternLayout pattern="${LOG_PATTERN_7}" />
            <Policies>
                <!-- filePattern %d{yyyy-MM-dd_HH-mm-ss}: interval = 20 second -->
                <!-- filePattern %d{yyyy-MM-dd_HH-mm}: interval = 20 minutes -->
                <!-- filePattern %d{yyyy-MM-dd_HH}: interval = 20 hours -->
                <TimeBasedTriggeringPolicy interval="20" modulate="true"/>
            </Policies>
            <DefaultRolloverStrategy max="1000" />
        </RollingFile>

        <Console name="Console" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="${LOG_PATTERN_7}" />
        </Console>
    </Appenders>

    <Loggers>
        <Root level="all" includeLocation="true">
            <AppenderRef ref="Console" />
            <AppenderRef ref="RollingFile" />
        </Root>
    </Loggers>

</Configuration>