【发布时间】:2014-04-09 22:22:25
【问题描述】:
据我所知,log4j2 中的 RollingFileAppender 不会在指定时间(比如说 - 一个小时结束时)翻转,而是在超过时间阈值后到达的第一个日志事件时翻转。
有没有办法触发一个事件,一方面会导致文件翻转,另一方面 - 不会附加到日志(或会附加一些琐碎的东西,如空字符串)?
【问题讨论】:
标签: log4j2 rollingfileappender
据我所知,log4j2 中的 RollingFileAppender 不会在指定时间(比如说 - 一个小时结束时)翻转,而是在超过时间阈值后到达的第一个日志事件时翻转。
有没有办法触发一个事件,一方面会导致文件翻转,另一方面 - 不会附加到日志(或会附加一些琐碎的东西,如空字符串)?
【问题讨论】:
标签: log4j2 rollingfileappender
不,没有任何(内置)方法可以做到这一点。没有后台线程监控翻转时间。
您可以创建一个实现 org.apache.logging.log4j.core.appender.rolling.TriggeringPolicy 的 log4j2 插件(请参阅内置的 TimeBasedTriggeringPolicy 和 SizeBasedTriggeringPolicy 类以获取示例代码。)
如果您配置自定义触发策略,log4j2 将检查每个日志事件是否应该触发翻转(因此在实现 isTriggeringEvent 方法时要小心,以免影响性能)。请注意,要获取自定义插件,您需要在 log4j2.xml 文件的 Configuration 元素的 packages 属性中指定类的包。
最后,如果这对您很有效,并且您认为您的解决方案可能对其他人也有用,请考虑将您的自定义触发策略回馈给 log4j2 代码库。
【讨论】:
按照 Remko 的想法,我编写了以下代码,并且它正在运行。
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();
}
}
【讨论】:
如果您有权访问对象 RollingFileAppender,您可以执行以下操作:
rollingFileAppender.getManager().rollover();
在这里你可以看到经理类:
【讨论】: