log4j2:如何强制滚动文件appender翻转?

时间:2014-04-09 22:22:25

标签: log4j2 rollingfileappender

据我所知,log4j2中的RollingFileAppender不会在指定的时间翻转(让我们说 - 在一小时结束时),但是在超过时间阈值后到达的第一个日志事件。

有没有办法触发一个事件,一方面会导致文件翻转,另一方面会不会附加到日志上(或者会附加一些微不足道的东西,比如一个空字符串)?

3 个答案:

答案 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();

在这里您可以看到经理班级:

https://github.com/apache/logging-log4j2/blob/d368e294d631e79119caa985656d0ec571bd24f5/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java