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

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

  %m%n       

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

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

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

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

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

CronTriggeringPolicy schedule =“0 0/20 * 1/1 *?*”/>

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

尝试这个 :

  foo.%d{yyyyMMdd-HHmm}.gz true 20  

代替

    

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

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

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

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