2010-06-08 22 views
15

¿Cómo (si es posible) puedo usar NLog como un registrador de archivos dinámicos? como si:Uso de NLog como un registrador de archivos de sustitución

Quiero tener como máximo 31 archivos durante 31 días y cuando un nuevo día comenzó, si hay un archivo de registro de un día anterior ##. log, entonces debe eliminarse pero durante ese día todos los registros son anexado y estará allí al menos durante 27 días.

Respuesta

21

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.

9

Yo sugeriría que separe el problema en dos aspectos diferentes:

  • balanceo a un nuevo nombre de archivo de cada día (? Tener en cuenta la zona horaria; UTC día quizá)
  • Eliminación de registro antiguo archivos

En mi experiencia, valdría la pena mantener la fecha en el nombre del archivo de registro, por ejemplo

debug-2010-06-08.log 

Esa parte debe ser fácil con Nlog, dada la examples in the docs.

Ahora la segunda parte se puede hacer fácilmente en un segundo hilo o posiblemente incluso en un proceso completamente diferente: solo necesita ver cuántos archivos están presentes y eliminar los más antiguos si es necesario. Encontrar el "más antiguo" debería ser fácil si la fecha está en el nombre del archivo, incluso si no desea confiar en la información del sistema de archivos.

De hecho, al mirar la documentación de NLog, parece que el objetivo "time-based file archival" puede hacer exactamente lo que usted desea ... pero incluso si no lo hace, el enfoque normal de "un archivo de registro por día" la limpieza debe ser fácil.

Cuestiones relacionadas