2011-11-07 18 views
20

Dentro de mi empresa estamos trabajando con NLog. Estamos experimentando problemas con una gran cantidad de archivos de registro. Lo que queremos hacer es archivar archivos por día y mantener un máximo de x cantidad de archivos. Digamos 7. He leído varios temas en Internet con respecto a esto y en su mayoría me señalan en la misma dirección de la modificación de mi archivo NLog.config. Sin embargo, no parece estar dispuesto a rotar los archivos como espero que haga. Actualmente no se está archivando nada en la carpeta deseada. Pero todos los archivos se guardan en el directorio 'logs' en el siguiente formato;NLog rotar y limpiar archivos de registro

Log.info.2011-11-07.txt 

Dentro de mi aplicación tengo un directorio 'logs'. Dentro de esa carpeta se guardan todos los archivos de registro. También tengo una carpeta llamada 'archivos' en la que quiero archivar todos los archivos más antiguos. Una vez que se alcanza la cantidad máxima de archivos de registro dentro de ese directorio, deben limpiarse automáticamente. es posible? Mi archivo NLog.config actual se ve a continuación;

<?xml version="1.0" encoding="utf-8" ?> 
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     autoReload="true" 
     throwExceptions="true" 
     internalLogFile="C:\nlog-internal.txt" 
     internalLogLevel="Error"> 

    <extensions> 
    <add assembly="NLog.Extended" /> 
    </extensions> 

    <targets> 
    <!-- will move file to archive once it reaches 1MB. Files are archived by day, with a maximum of three files. ConcurrentWrites is set to false, 
      change to true if multiple processes will be writing to the logfile--> 
    <target name="file" xsi:type="File" fileName="${basedir}/logs/Log.info.${shortdate}.txt" 
      layout="${longdate} ${callsite} ${level}: ${message} ${exception:format=Message,StackTrace} ${stacktrace}" 
      archiveFileName="${basedir}/logs/archives/log.info.${shortdate}.txt" 
      archiveAboveSize="1048576" 
      archiveEvery="Day" 
      archiveNumbering = "Rolling" 
      maxArchiveFiles="7" 
      concurrentWrites="false" 
      /> 
    <target name="file-default" xsi:type="File" fileName="${basedir}/log_default.txt"/> 
    <target name="file-debug" xsi:type="File" fileName="${basedir}/log_debug.txt"/> 
    <target name="file-testclass" xsi:type="File" fileName="${basedir}/log_testclass.txt"/> 
    <target name="mail" xsi:type="Mail" 
      subject="${level} - ${aspnet-request:serverVariabele=PATH_INFO} | ${callsite:includeSourcePath=true}" 
      to="[email protected]" 
      smtpServer="mail.server.com" 
      from="[email protected]"/> 
    <target xsi:type="Database" 
      name="TestDatabaseLogging" 
      connectionString="Data Source=123.123.123.123;Initial Catalog=NLog_Test;User ID=su_Nlog;Password=test123" 
      dbDatabase="NLog_Test"> 
     <commandText> 
     insert into INNO_LOG ([createDate], [Origin], [LogLevel], [Message], [Exception], [StackTrace]) values (@createDate, @origin, @logLevel, @message, @exception, @stackTrace) 
     </commandText> 
     <parameter name="@createDate" layout="${date}"/> 
     <parameter name="@origin" layout="${callsite}"/> 
     <parameter name="@logLevel" layout="${level}"/> 
     <parameter name="@message" layout="${message}"/> 
     <parameter name="@exception" layout="${exception:format=Message,StackTrace}"/> 
     <parameter name="@stackTrace" layout="${stacktrace}"/> 
    </target> 

    </targets> 

    <rules> 
    <logger name="*" minlevel="Fatal" writeTo="mail" /> 
    <logger name="*" minlevel="Error" writeTo="TestDatabaseLogging" /> 
    <logger name="*" minlevel="Debug" writeTo="file-debug" /> 
    <logger name="*" minlevel="Info" writeTo="file" /> 
    <!--Log to specific files for specific classes.--> 
    <logger name="_Default" minlevel="Trace" writeTo="file-default" /> 
    <logger name="TestClass" minlevel="Trace" writeTo="file-testclass" /> 
    </rules> 
</nlog> 

EDIT: El (snipped) solución final después de ckellers responden.

<target name="file" 
      xsi:type="File" 
      fileName="${basedir}/logs/Log.${level}.current.txt" 
      layout="${longdate} ${callsite} ${level}: ${message} ${exception:format=Message,StackTrace} ${stacktrace}" 
      archiveFileName="${basedir}/logs/archives/log.error.${shortdate}.{#}.txt" 
      archiveAboveSize="5242880" 
      archiveEvery="Day" 
      archiveNumbering = "Rolling" 
      maxArchiveFiles="3" /> 

Respuesta

15

Parece que el problema es shortdate en la definición del nombre de archivo. Véase mi respuesta a esta pregunta: Delete log files after x days

Hay que definir el nombre del archivo sin la parte de fecha

fileName="${basedir}/logs/Log.info.txt 
+0

que lo hizo! Encontré el tema a través de Google antes, pero nunca pensé que el shortdate en el nombre causaría el problema. ¡Agregué {#} después del shortdate y funcionó! – Rob

+0

@Rob gracias por la sugerencia con el '{#}'! No lo sabía. – ccellar

+0

de nada :) – Rob

Cuestiones relacionadas