2010-02-18 16 views
11

zamiar:log4net - Usuń stare pliki toczenia według daty

a) Chcę moje logi mają być zwijane daty w następującym formacie pliku rrrr-mm-dd.txt.

b) Oprócz tego chcę usunąć stare pliki, które nie mieszczą się w zakresie maxSizeRollBackups.

CAUTION A maximum number of backup files when rolling on date/time 
    boundaries is not supported. [RollingFileAppender spec][1] 

ROZWIĄZANIE

dla a) wystarczy wykonać konfigurację

<appender name="FileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="logs\" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Date" /> 
    <maxSizeRollBackups value="30" /> 
    <datePattern value="yyyy-MM-dd'.txt'" /> 
    <staticLogFileName value="false" /> 
    <layout type="log4net.Layout.XmlLayoutSchemaLog4j"/> 
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
</appender> 

dla b) Czy dziedziczenie z RollingFileAppender + delete rzeczy jedynym sposobem osiągnięcia tego celu ?

+0

Oto Uwaga -> http://logging.apache.org/log4net/release/ sdk/log4net.Appender.RollingFileAppender.html – ruslander

Odpowiedz

7

Spędziłem trochę czasu, zaglądając w to kilka miesięcy temu. v1.2.10 nie obsługuje usuwania starszych plików dziennika na podstawie daty przetaczania. Znajduje się na liście zadań do następnego wydania. Wziąłem kod źródłowy i dodałem funkcję samodzielnie, i opublikowałem ją dla innych, jeśli są zainteresowani. Problem i łatę można znaleźć pod adresem https://issues.apache.org/jira/browse/LOG4NET-27.

+2

Dodałeś łatkę w 2005 roku i nadal nie została ona zaakceptowana ?! –

+1

(prawdę mówiąc, to nie jest bardzo aktywny projekt) Wyjaśnienie, dlaczego jest https://issues.apache.org/jira/browse/LOG4NET-27?focusedCommentId=13248077&page=com.atlassian.jira.plugin.system .issuetabpanels: comment-tabpanel # comment-13248077 –

1

Wygląda na to, że łatka w wersji 4 z RollingFileAppenderer podana tutaj https://issues.apache.org/jira/secure/attachment/12565940/RollingFileAppender.zip działa poprawnie z drobną zmianą: w linii 1286 zastępuje ". *" Przez "*".

W tym celu można użyć następującej konfiguracji:

<appender name="RollingFile" type="log4net.Appender.RollingFileAppender"> 
    <file type="log4net.Util.PatternString" value="MyProduct.log" /> 
    <param name="DatePattern" value="'_'yyyy-MM-dd"/> 
    <param name="AppendToFile" value="true"/> 
    <param name="RollingStyle" value="Date"/> 
    <param name="StaticLogFileName" value="false"/> 
    <param name="MaxDateRollBackups" value="3" /> 
    <param name="preserveLogFileNameExtension" value="true" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <param name="ConversionPattern" value="%r %d [%t] %-5p %c - %m%n"/> 
    </layout> 
</appender> 
0

Biorąc pod uwagę, że ponad dziesięć lat minęło i wciąż nie jest obsługiwany, zdecydowałem się na następującym roztworze nadrzędnym RollingFileAppender z wymaganą funkcjonalność:

public class RollingDateAppender : RollingFileAppender { 
    public TimeSpan MaxAgeRollBackups { get; set; } 

    public RollingDateAppender() 
    : base() { 
    PreserveLogFileNameExtension = true; 
    StaticLogFileName = false; 
    } 

    protected override void AdjustFileBeforeAppend() { 
    base.AdjustFileBeforeAppend(); 

    string LogFolder = Path.GetDirectoryName(File); 
    var CheckTime = DateTime.Now.Subtract(MaxAgeRollBackups); 
    foreach (string file in Directory.GetFiles(LogFolder, "*.log")) { 
     if (System.IO.File.GetLastWriteTime(file) < CheckTime) 
     DeleteFile(file); 
    } 
    } 

} 

Konfiguracja jest tak proste jak w przypadku oryginalnej klasy:

roller = new RollingDateAppender { 
    AppendToFile = true, 
    File = ...; 
    MaxAgeRollBackups = TimeSpan.FromDays(7), 
    RollingStyle = RollingFileAppender.RollingMode.Date, 
    ... 
}; 
roller.ActivateOptions(); 
BasicConfigurator.Configure(roller); 

Należy pamiętać, że poszukiwanie plików *.log w katalogu dzienników ma sens jedynie w przypadku użycia PreserveLogFileNameExtension lub użycia DatePattern do dołączenia rozszerzenia na końcu nazwy pliku. Jeśli potrzebujesz innego schematu nazewnictwa, zmodyfikuj je w synchronizacji.

(użyłem wersji 2.0.8 z log4net, wcześniejsze wersje mogą nie pozwolić konieczne funkcja być nadpisane.)