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

时间:2014-10-23 19:34:21

标签: log4net rollingfileappender fileappender

我希望能够调用像我的“log.txt”复制到“log.txt.1”的“ResetLog”之类的方法,而不是在日期/时间或指定的最大大小之后滚动日志,然后清除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有这样的东西会很好,但我也没有看到它的文档有用。

1 个答案:

答案 0 :(得分:3)

如果我们查看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

如果必须发生,您可以决定掷骰的条件。一个想法是创建一个静态事件,您的自定义滚动appender会怀疑:当事件被触发时,appender会记录它(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;
        }
    }
}