Finalmente me he conformado con size-based file archival. Utilizo un truco para nombrar el archivo después del día del mes y necesitaba el archivo de archivo basado en el tamaño porque realmente ayuda cuando los registros comienzan a crecer más allá de unos cien mega bytes. Ayuda a hacer, por ejemplo, 20 MB de trozos de registro, por lo que uno puede echarle un rápido vistazo con una herramienta ligera como Notepad ++.
Funciona desde hace casi un año. Aquí es una versión simplificada de mi archivo NLog.config
:
<?xml version="1.0" encoding="utf-8" ?>
<nlog autoReload="true" throwExceptions="true"
xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<variable name="LogDir" value="${specialfolder:folder=MyDocuments}/MyApp/Log"/>
<variable name="LogDay" value="${date:format=dd}"/>
<targets>
<target name="LogTarget1" xsi:type="File" fileName="${LogDir}/${LogDay}.log" encoding="utf-8"
maxArchiveFiles="10" archiveNumbering="Sequence" archiveAboveSize="1048576" archiveFileName="${LogDir}/{#######}.a" />
</targets>
<rules>
<logger name="AppLog" writeTo="LogTarget1" />
</rules>
</nlog>
Esta configuración hace que el archivo de registro de 1 MB para cada día del mes y mantener como máximo el 10 archivados trozos de registro de 1 MB en My Documents\MyApp\Log
carpeta; como 29.log
, 30.log
y 31.log
.
Editar: Hace un tiempo que uso este archivo NLog.config
y cubre casi todos los casos que necesito.Tengo diferentes niveles de registro de diferentes clases en archivos separados y cuando ellos tienen grande, que recibirán archivado en función del tamaño, de manera horaria:
<?xml version="1.0" encoding="utf-8" ?>
<nlog autoReload="true" throwExceptions="true" internalLogFile="nlog-internals.log"
xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<variable name="LogHome" value="${basedir}/Log"/>
<variable name="DailyDir" value="${LogHome}/${date:format=yyyy}/${date:format=MM}/${date:format=dd}"/>
<variable name="HourlyArchive" value="${DailyDir}/${date:format=HH}-Archive/${level}-${logger}-{#######}-archived.a"/>
<variable name="AppLogPath" value="${DailyDir}/${level}-${logger}.log"/>
<variable name="DataLogPath" value="${DailyDir}/_data/inouts-${shortdate}.log"/>
<variable name="EventSource" value="Application" />
<targets>
<target name="AppAsyncTarget" xsi:type="AsyncWrapper">
<target xsi:type="RetryingWrapper" retryDelayMilliseconds="3000" retryCount="10">
<target xsi:type="File" fileName="${AppLogPath}" encoding="utf-8"
maxArchiveFiles="50" archiveNumbering="Sequence" archiveAboveSize="1048576" archiveFileName="${HourlyArchive}"
layout="`${longdate}`${level}`${message}" />
</target>
</target>
<target name="DataAsyncTarget" xsi:type="AsyncWrapper">
<target xsi:type="RetryingWrapper" retryDelayMilliseconds="1500" retryCount="300">
<target xsi:type="File" fileName="${DataLogPath}" encoding="utf-8"
layout="`${longdate}`${message}" />
</target>
</target>
<target name="EventLogAsyncTarget" xsi:type="AsyncWrapper">
<target xsi:type="RetryingWrapper">
<target xsi:type="EventLog" source="${EventSource}" machineName="." />
</target>
</target>
</targets>
<rules>
<logger name="Data" writeTo="DataAsyncTarget" final="true" />
<logger name="Event" writeTo="EventLogAsyncTarget" final="true" />
<logger name="*" writeTo="AppAsyncTarget" />
</rules>
</nlog>
Y en cada clase que yo quiero una funcionalidad de registro , Puse esto:
static readonly Logger SlotClassLogger = LogManager.GetCurrentClassLogger();
static Logger ClassLogger { get { return SlotClassLogger; } }
Dos registradores adicionales son para acumular algunos datos a diario y escribir en el Registro de eventos de Windows; que son los registradores de toda la app:
public static Logger DataLog { get; private set; }
public static Logger AppEventLog { get; private set; }
Y deben inicializar en el arranque de aplicaciones:
DataLog = LogManager.GetLogger("Data");
AppEventLog = LogManager.GetLogger("Event");
Nota: A veces en que la salida aplicación se obtiene una excepción producida por Nlog. ¡Es porque algo que no está inicializado no puede eliminarse! Que acaba de escribir una entrada vacía en su registrador en la puesta en aplicación, dice:
DataLog.Info(string.Empty);
me han añadido este límite de tamaño por lo que el archivo de registro se puede ver en (por ejemplo) el Bloc de notas en un servidor de gama baja, para una revisión rápida . Debe modificarlos en función de sus necesidades.