Log4Net: imposta i file di backup Max su RollingFileAppender con data rolling

Ho la seguente configurazione, ma non ho potuto trovare alcuna documentazione su come impostare un file di backup massimo sullo stile di rotazione delle date. So che puoi farlo con lo stile di rolling delle dimensioni usando maxSizeRollBackups.

          

Non puoi

dal riferimento SDK log4net
RollingFileAppender Class

ATTENZIONE

Un numero massimo di file di backup quando si esegue il roll out dei limiti di data / ora non è supportato.

Anche se non è supportato, ecco come ho gestito questa situazione:

Questa è la mia configurazione:

             

All’avvio dell’applicazione faccio ciò che segue:

  XmlConfigurator.Configure(); var date = DateTime.Now.AddDays(-10); var task = new LogFileCleanupTask(); task.CleanUp(date); 

 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using log4net; using log4net.Appender; using log4net.Config; public class LogFileCleanupTask { #region - Constructor - public LogFileCleanupTask() { } #endregion #region - Methods - ///  /// Cleans up. Auto configures the cleanup based on the log4net configuration ///  /// Anything prior will not be kept. public void CleanUp(DateTime date) { string directory = string.Empty; string filePrefix = string.Empty; var repo = LogManager.GetAllRepositories().FirstOrDefault(); ; if (repo == null) throw new NotSupportedException("Log4Net has not been configured yet."); var app = repo.GetAppenders().Where(x => x.GetType() == typeof(RollingFileAppender)).FirstOrDefault(); if (app != null) { var appender = app as RollingFileAppender; directory = Path.GetDirectoryName(appender.File); filePrefix = Path.GetFileName(appender.File); CleanUp(directory, filePrefix, date); } } ///  /// Cleans up. ///  /// The log directory. /// The log prefix. Example: logfile dont include the file extension. /// Anything prior will not be kept. public void CleanUp(string logDirectory, string logPrefix, DateTime date) { if (string.IsNullOrEmpty(logDirectory)) throw new ArgumentException("logDirectory is missing"); if (string.IsNullOrEmpty(logPrefix)) throw new ArgumentException("logPrefix is missing"); var dirInfo = new DirectoryInfo(logDirectory); if (!dirInfo.Exists) return; var fileInfos = dirInfo.GetFiles("{0}*.*".Sub(logPrefix)); if (fileInfos.Length == 0) return; foreach (var info in fileInfos) { if (info.CreationTime < date) { info.Delete(); } } } #endregion } 

Il Sub Method è un metodo di estensione, fondamentalmente avvolge string.format in questo modo:

 ///  /// Extension helper methods for strings ///  [DebuggerStepThrough, DebuggerNonUserCode] public static class StringExtensions { ///  /// Formats a string using the  and . ///  /// The format. /// The args. /// A string with the format placeholders replaced by the args. public static string Sub(this string format, params object[] args) { return string.Format(format, args); } } 

Ho passato un po ‘di tempo a esaminare questo alcuni mesi fa. v1.2.10 non supporta l’eliminazione dei file di registro precedenti in base alla data corrente. È nella lista delle attività per la prossima versione. Ho preso il codice sorgente e ho aggiunto la funzionalità da solo, e l’ho pubblicato per altri se fossero interessati. Il problema e la patch sono disponibili su https://issues.apache.org/jira/browse/LOG4NET-27 .

Per limitare il numero di log, non includere l’anno o il mese nel datapattern, ad es. DatePattern value = “_ dd’.log ‘”

Questo creerà un nuovo log ogni giorno e verrà sovrascritto il prossimo mese.

Non sono sicuro di cosa hai bisogno. Di seguito è riportato un estratto da uno dei miei file lo4net.config:

             

Recentemente mi sono imbattuto in questa esigenza nel tentativo di ripulire i registri di log in base a un valore di configurazione maxAgeInDays passato al mio servizio … Come molti hanno già fatto prima, sono diventato esposto alla funzionalità ‘Tunneling’ di NTFS, che rende problematico l’uso di FileInfo.CreationDate (anche se da allora ho lavorato anche su questo) …

Dato che avevo uno schema da seguire, ho deciso di eseguire il mio metodo di pulizia … Il mio logger è configurato a livello di programmazione, quindi mi limito a richiamare quanto segue dopo aver completato la configurazione del mio registratore …

  //......................... //Log Config Stuff Above... log4net.Config.BasicConfigurator.Configure(fileAppender); if(logConfig.DaysToKeep > 0) CleanupLogs(logConfig.LogFilePath, logConfig.DaysToKeep); } static void CleanupLogs(string logPath, int maxAgeInDays) { if (File.Exists(logPath)) { var datePattern = "yyyy.MM.dd"; List logPatternsToKeep = new List(); for (var i = 0; i < = maxAgeInDays; i++) { logPatternsToKeep.Add(DateTime.Now.AddDays(-i).ToString(datePattern)); } FileInfo fi = new FileInfo(logPath); var logFiles = fi.Directory.GetFiles(fi.Name + "*") .Where(x => logPatternsToKeep.All(y => !x.Name.Contains(y) && x.Name != fi.Name)); foreach (var log in logFiles) { if (File.Exists(log.FullName)) File.Delete(log.FullName); } } } 

Probabilmente non è l’approccio più carino, ma funziona piuttosto bene per i nostri scopi …

NLog , che è configurato quasi come Log4Net (e viene mantenuto triggersmente – ha persino il supporto per .NET Core), supporta i registri di rolling in base alla data.

È abbastanza facile ereditare da un appender di log4net e aggiungere il proprio metodo di override che esegue la pulizia dei file. Ho scavalcato OpenFile per farlo. Ecco un esempio di appender log4net personalizzato per iniziare: https://stackoverflow.com/a/2385874/74585