【问题标题】:"Manually" rolling a log4net RollingFileAppender log file?“手动”滚动 log4net RollingFileAppender 日志文件?
【发布时间】:2014-10-23 19:34:21
【问题描述】:

我希望能够调用像“ResetLog”这样的方法,将我的“log.txt”复制到“log.txt.1”然后清除,而不是在日期/时间或指定的最大大小之后滚动日志日志.txt。

我尝试通过使用 FileAppender 而不是 RollingFileAppender 来实现这一点:

var appenders = log4net.LogManager.GetRepository().GetAppenders();
foreach (var appender in appenders) {
    var fa = appender as log4net.Appender.FileAppender;
    if (fa != null) {
        string logfile = fa.File;
        fa.Close();
        string new_file_path = CreateNextLogFile(logfile);
        fa.File = new_file_path;
        fa.ActivateOptions();
    }
}            

文件被关闭并且 CreateNextLogFile() 重命名它。然后我创建一个新的日志文件并将 FileAppender 设置为使用它。但是,我认为 ActivateOptions 会继续使用所需的设置重新配置 FileAppender。我查看了 log4net 文档,没有看到任何其他允许我在关闭 FileAppender 后重新打开它的公共方法。谁能推荐一种实现翻转的方法?如果 RollingFileAppender 有这样的东西就好了,但我也没有看到它的文档有什么用处。

【问题讨论】:

    标签: log4net rollingfileappender fileappender


    【解决方案1】:

    如果我们查看RollingFileAppender,我们可以看到翻转机制包括关闭文件、重命名现有文件(可选)并再次打开它:

    // log4net.Appender.RollingFileAppender
    protected void RollOverSize()
    {
        base.CloseFile();
        // debug info removed
        this.RollOverRenameFiles(this.File);
        if (!this.m_staticLogFileName && this.m_countDirection >= 0)
        {
            this.m_curSizeRollBackups++;
        }
        this.SafeOpenFile(this.m_baseFileName, false);
    }
    

    不幸的是,CloseFile/SafeOpenFile 方法受到保护,这意味着您无法从外部访问它(不容易)。所以最好的办法是编写一个继承自 RollingFileAppender 的 appender,并覆盖在将任何日志事件添加到 appender 之前调用的虚拟 AdjustFileBeforeAppend。

    如果必须发生,您可以在此处决定掷骰的条件是什么。一个想法是创建一个您的自定义滚动附加程序订阅的静态事件:当事件被触发时,附加程序会记下它(rollBeforeNextAppend = true;)。只要您尝试记录下一个条目,appender 就会滚动。

    public class CustomRollingAppender: RollingFileAppender
    {
        public CustomRollingAppender()
        {
            MyStaticCommandCenter.RollEvent += Roll;
        }
    
        public void Roll()
        {
            rollBeforeNextAppend = true;
        }
    
        public bool rollBeforeNextAppend {get; set;}
        public override void AdjustFileBeforeAppend()
        {
            if (rollBeforeNextAppend) {
                CloseFile();
                RollOverRenameFiles(File);
                SafeOpenFile(Filename, false);
                rollBeforeNextAppend = false;
            }
        }
    }
    

    【讨论】:

    • 这是个好主意,萨米,我会试一试!谢谢。
    猜你喜欢
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    相关资源
    最近更新 更多