Log4Net: establece archivos de copia de seguridad máximos en RollingFileAppender con Fecha de laminación

Tengo la siguiente configuración, pero no he podido encontrar ninguna documentación sobre cómo establecer un máximo de archivos de copia de seguridad en el estilo de actualización de fechas. Sé que puedes hacer esto con el estilo de balanceo de tamaño mediante el uso de maxSizeRollBackups.

          

No puedes.

de la referencia SDK de log4net
RollingFileAppender Class

PRECAUCIÓN

No se admite una cantidad máxima de archivos de copia de seguridad cuando se superan los límites de fecha / hora.

Aunque no es compatible, así es como manejé esta situación:

Esta es mi configuración:

             

En el inicio de la aplicación lo hago:

  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 } 

El Método Sub es un Método de Extensión, básicamente envuelve a string.format así:

 ///  /// 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); } } 

Pasé un tiempo investigando esto hace unos meses. v1.2.10 no admite la eliminación de archivos de registro anteriores en función de la fecha de caducidad. Está en la lista de tareas para la próxima versión. Tomé el código fuente y agregué la funcionalidad yo mismo, y la publiqué para otros si están interesados. El problema y el parche se pueden encontrar en https://issues.apache.org/jira/browse/LOG4NET-27 .

Para limitar el número de registros, no incluya el año o mes en el patrón de fecha, por ejemplo, datePattern value = “_ dd’.log ‘”

Esto creará un nuevo registro cada día y se sobrescribirá el próximo mes.

No estoy seguro exactamente de lo que necesita A continuación se muestra un extracto de uno de mis archivos lo4net.config:

             

Recientemente me encontré con esta necesidad al intentar limpiar los registros de registro en función de un valor de configuración de maxAgeInDays pasado a mi servicio … Como muchos antes que yo, me expuse a la función ‘Tunneling’ de NTFS, lo que hace que el uso de FileInfo.CreationDate sea problemático. (Aunque ya he trabajado alrededor de esto también) …

Como tenía un patrón por el cual me iba, decidí simplemente rodar mi propio método de limpieza … Mi registrador está configurado programáticamente, así que simplemente llamo a lo siguiente después de que mi configuración de registrador se haya completado …

  //......................... //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); } } } 

Probablemente no sea el enfoque más bonito, pero funciona bastante bien para nuestros propósitos …

NLog , que está configurado casi de la misma manera que Log4Net (y se mantiene activamente, incluso tiene soporte para .NET Core), admite registros continuos basados ​​en la fecha.

Es bastante fácil heredar de un apéndice log4net y agregar decir su propio método de reemplazo que realiza la limpieza de archivos. Sobreescribí OpenFile para hacer esto. Aquí hay un ejemplo de un apéndice de log4net personalizado para que pueda comenzar: https://stackoverflow.com/a/2385874/74585