net implement for example configurar asp c# .net nlog

c# - implement - Usando NLog como un registrador de archivos de rollover



nlog levels (2)

Finalmente he resuelto con el archivo de archivo basado en tamaño . Utilizo un truco para nombrar el archivo después del día del mes y necesitaba el archivo de archivos basado en el tamaño porque realmente ayuda cuando los registros comienzan a crecer más allá de unos cientos de megabytes. Ayuda a hacer, por ejemplo, 20 MB de trozos de registro, por lo que uno puede echarle un rápido vistazo con una herramienta liviana como Notepad ++.

Funciona desde hace casi un año. Aquí hay 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 crea un archivo de registro de 1 MB para cada día del mes y conserva como máximo 10 fragmentos de registro de 1 MB archivados en My Documents/MyApp/Log carpeta My Documents/MyApp/Log ; como 29.log , 30.log y 31.log .

Edición: Es por algún 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 son grandes, se archivarán según el tamaño, de manera por hora:

<?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 quiero una funcionalidad de registro, pongo esto:

static readonly Logger SlotClassLogger = LogManager.GetCurrentClassLogger(); static Logger ClassLogger { get { return SlotClassLogger; } }

Dos registradores adicionales son para recopilar algunos datos diariamente y escribir en el Registro de eventos de Windows; que son los registradores de toda la aplicación:

public static Logger DataLog { get; private set; } public static Logger AppEventLog { get; private set; }

Y deberían inicializarse al inicio de la aplicación:

DataLog = LogManager.GetLogger("Data"); AppEventLog = LogManager.GetLogger("Event");

Nota: A veces, en la salida de tu aplicación, obtienes una excepción producida por NLog. Es porque algo que no se inicializa, no se puede desechar! Acaba de escribir una entrada vacía en su registrador al iniciar la aplicación, por ejemplo:

DataLog.Info(string.Empty);

He agregado esta limitación de tamaño para que el archivo de registro se pueda ver en (digamos) el Bloc de notas en un servidor de gama baja, para revisiones rápidas. Debes modificarlos en función de tus necesidades.

¿Cómo, si es posible, puedo usar NLog como registrador de archivos de rollover? como si:

Quiero tener un máximo de 31 archivos durante 31 días y, cuando comience un nuevo día, si hay un archivo de registro del día anterior ##. Log, debería eliminarse, pero durante ese día todos los registros se adjuntan y estarán al menos Durante 27 días.


Le sugiero que separe el problema en dos aspectos diferentes:

  • Desplazarse a un nuevo nombre de archivo cada día (tenga en cuenta la zona horaria; ¿el día UTC, tal vez?)
  • Eliminar archivos de registro antiguos

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 debería ser fácil con NLog, dados los ejemplos en los documentos .

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, mirando la documentación de NLog, parece que el objetivo de "archivado de archivos basado en tiempo" puede hacer exactamente lo que quiere ... pero incluso si no lo hace, el enfoque normal de "un archivo de registro por día" su propia limpieza debe ser fácil