1

日付/時刻または指定された最大サイズの後にログをロールするのではなく、「log.txt」を「log.txt.1」にコピーしてから log.txt をクリアする「ResetLog」のようなメソッドを呼び出せるようにしたいと考えています。 .

RollingFileAppender ではなく、FileAppender で次のようなことを行うことで、それを実装しようとしました。

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メソッドは保護されているため、外部からアクセスすることはできません (簡単ではありません)。したがって、最善の策は、から継承するアペンダーを作成し、ロギング イベントがアペンダーに追加される前に呼び出されるRollingFileAppendervirtual をオーバーライドすることです。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;
        }
    }
}
于 2014-10-24T08:08:09.600 に答える