Log4j2在指定的持续时间后自动翻转

时间:2015-04-16 10:49:17

标签: java logging log4j log4j2

我正在使用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>

5 个答案:

答案 0 :(得分:2)

我不认为你可以每隔N分钟开始使用Log4J2滚动,看起来你可以让它每分钟,每小时,每天但不是20分钟。 (请参阅https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/DailyRollingFileAppender.html - 您可以将其更改为&#34;每分钟&#34;使用不同的日期模式)

我没试过这个,但可能有办法通过提供自定义的滚动策略来定制这个...

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

如果有效,请将您的答案发布给其他人学习!

答案 1 :(得分:1)

我们可以使用玉米表达政策

来做到这一点

CronTriggeringPolicy schedule =&#34; 0 0/20 * 1/1 *? *&#34; /&GT;

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

答案 2 :(得分:0)

试试这个:

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

答案 3 :(得分:0)

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

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

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


在初始化(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());
    }


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

答案 4 :(得分:0)

将第二个单位的 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>