1

我不想在日期/时间或指定的最大大小之后滚动日志,而是希望能够调用像“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();
    }
}            

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

4

1 回答 1

4

如果我们看一下,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的虚拟。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;
        }
    }
}
于 2014-10-24T08:08:09.600 回答