“手动”滚动 log4net RollingFileAppender 日志文件?

Dav*_*ave 1 log4net rollingfileappender fileappender

我希望能够调用像“ResetLog”这样的方法,将我的“log.txt”复制到“log.txt.1”,然后清除log.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();
    }
}            
Run Code Online (Sandbox Code Playgroud)

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

sam*_*amy 5

如果我们看一下,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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)