2014-10-23 3 views
0

Вместо того, чтобы рулон журнала после даты/времени или указанного максимального размера, я хочу иметь возможность вызвать метод типа «ResetLog», который копирует мой «log.txt» в «log.txt.1», а затем очищает журнал .текст.«Вручную» катит файл журнала log4net RollingFileAppender?

Я пытался реализовать, что делать что-то подобное с 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

Если мы посмотрим на 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;). Как только вы попытаетесь войти в следующую запись, приложение перевернется.

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; 
     } 
    } 
} 
+0

Это отличная идея, я, я попробую! Спасибо. – Dave

Смежные вопросы