net .net log4net

.net - log4net vs nlog



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

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.

<appender name="AppLogFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="mylog.log" /> <appendToFile value="true" /> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <rollingStyle value="Date" /> <datePattern value=".yyMMdd.''log''" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%d %-5p %c - %m%n" /> </layout> </appender>


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

Esta es mi configuración:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="C:/logs/LoggingTest/logfile.txt" /> <appendToFile value="true" /> <rollingStyle value="Composite" /> <datePattern value="yyyyMMdd" /> <maxSizeRollBackups value="10" /> <maximumFileSize value="1MB" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date - %message%newline" /> </layout> </appender>

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 - /// <summary> /// Cleans up. Auto configures the cleanup based on the log4net configuration /// </summary> /// <param name="date">Anything prior will not be kept.</param> 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); } } /// <summary> /// Cleans up. /// </summary> /// <param name="logDirectory">The log directory.</param> /// <param name="logPrefix">The log prefix. Example: logfile dont include the file extension.</param> /// <param name="date">Anything prior will not be kept.</param> 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í:

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


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://.com/a/2385874/74585


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

<appender name="RollingFile" type="log4net.Appender.RollingFileAppender"> <param name="File" value="App_Data/log"/> <param name="DatePattern" value=".yyyy-MM-dd-tt&quot;.log&quot;"/> <param name="AppendToFile" value="true"/> <param name="RollingStyle" value="Date"/> <param name="StaticLogFileName" value="false"/> <param name="maxSizeRollBackups" value="60" /> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%r %d [%t] %-5p %c - %m%n"/> </layout> </appender>



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.


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 .


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<string> logPatternsToKeep = new List<string>(); 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.