【问题标题】:How to force log4j2 rolling file appender to roll over?如何强制 log4j2 滚动文件附加程序翻转?
【发布时间】:2014-04-09 22:22:25
【问题描述】:

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

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

【问题讨论】:

    标签: log4j2 rollingfileappender


    【解决方案1】:

    不,没有任何(内置)方法可以做到这一点。没有后台线程监控翻转时间。

    您可以创建一个实现 org.apache.logging.log4j.core.appender.rolling.TriggeringPolicy 的 log4j2 插件(请参阅内置的 TimeBasedTriggeringPolicy 和 SizeBasedTriggeringPolicy 类以获取示例代码。)

    如果您配置自定义触发策略,log4j2 将检查每个日志事件是否应该触发翻转(因此在实现 isTriggeringEvent 方法时要小心,以免影响性能)。请注意,要获取自定义插件,您需要在 log4j2.xml 文件的 Configuration 元素的 packages 属性中指定类的包。

    最后,如果这对您很有效,并且您认为您的解决方案可能对其他人也有用,请考虑将您的自定义触发策略回馈给 log4j2 代码库。

    【讨论】:

    • 后台线程是很容易在 log4j2 框架之外实现的东西。问题是:log4j2 中是否有任何 API 调用会触发翻转验证/执行逻辑?换句话说 - 如果我自己开发后台线程,我可以调用 log4j2 端的任何 API 来触发翻转验证吗?
    • 我明白了,我以为您在寻找内置解决方案。我编辑了我的答案。
    • 这种技术是否也适用于 Logback?
    • 我想分享一下 log4j2 触发 .log 文件翻转的解决方案。发布于:github。请参阅 README 中的说明和说明。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果您有权访问对象 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-05
        • 2021-07-11
        • 1970-01-01
        • 1970-01-01
        • 2016-10-14
        • 2017-03-10
        • 2023-04-05
        • 2023-03-30
        相关资源
        最近更新 更多