据我所知,log4j2中的RollingFileAppender不会在指定的时间翻转(让我们说 - 在一小时结束时),但是在超过时间阈值后到达的第一个日志事件。
有没有办法触发一个事件,一方面会导致文件翻转,另一方面会不会附加到日志上(或者会附加一些微不足道的东西,比如一个空字符串)?
答案 0 :(得分:3)
没有任何(内置)方法可以做到这一点。没有后台线程监视翻转时间。
编辑:
您可以创建一个实现org.apache.logging.log4j.core.appender.rolling.TriggeringPolicy
的log4j2插件(请参阅内置的TimeBasedTriggeringPolicy和SizeBasedTriggeringPolicy类以获取示例代码。)
如果配置自定义触发策略,log4j2将检查每个日志事件是否应触发翻转(因此在实施isTriggeringEvent
方法时要小心以避免影响性能)。请注意,要获取自定义插件,您需要在log4j2.xml文件的packages
元素的Configuration
属性中指定类的包。
最后,如果这对您有用并且您认为您的解决方案对其他人也有用,请考虑将自定义触发策略提供回log4j2代码库。
答案 1 :(得分:0)
按照雷姆科的想法,我编写了以下代码,并且可以正常工作。
package com.stony;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.rolling.*;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
@Plugin(name = "ForceTriggerPolicy", category = "Core")
public class ForceTriggerPolicy implements TriggeringPolicy {
private static boolean isRolling;
@Override
public void initialize(RollingFileManager arg0) {
setRolling(false);
}
@Override
public boolean isTriggeringEvent(LogEvent arg0) {
return isRolling();
}
public static boolean isRolling() {
return isRolling;
}
public static void setRolling(boolean _isRolling) {
isRolling = _isRolling;
}
@PluginFactory
public static ForceTriggerPolicy createPolicy(){
return new ForceTriggerPolicy();
}
}
答案 2 :(得分:0)
如果您有权访问对象 RollingFileAppender ,则可以执行以下操作:
rollingFileAppender.getManager().rollover();
在这里您可以看到经理班级: