2011-11-07 15 views
20

W ramach mojej firmy pracujemy z NLog. Występują problemy z dużą liczbą plików dzienników. Chcemy archiwizować pliki według dni i przechowywać maksymalnie x ilości plików. Powiedzmy 7. Czytałem kilka tematów w Internecie na ten temat i wskazują one głównie w ten sam sposób na modyfikowanie mojego pliku NLog.config. Jednak wydaje się, że nie chce on obracać plików, jak się spodziewam. Obecnie nic nie jest archiwizowane w żądanym folderze. Ale wszystkie pliki są zapisywane w katalogu "logs" w następującym formacie;NLog rotacja i czyszczenie logów

Log.info.2011-11-07.txt 

W mojej aplikacji mam katalog "logi". W tym folderze zapisywane są wszystkie logi. Mam też folder o nazwie "archiwa", w którym chcę zarchiwizować wszystkie starsze pliki. Po osiągnięciu maksymalnej liczby plików dziennika w tym katalogu, należy je automatycznie wyczyścić. czy to możliwe? Mój bieżący plik NLog.config wygląda jak poniżej;

<?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> 

Edycja: końcowy (wycięte) roztworu po ckellers odpowiedzi.

<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" /> 

Odpowiedz

15

Wygląda na to, że problemem jest shortdate w definicji nazwy pliku. Zobacz moją odpowiedź na to pytanie: Delete log files after x days

Musisz określić nazwę pliku bez części data

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

że to zrobił! Znalazłem temat w Google wcześniej, ale nigdy nie sądziłem, że krótka data w nazwie spowodowałaby problem. Dodałem {#} po krótkiej dacie i zadziałało! – Rob

+0

@Rob dzięki za wskazówkę z '{#}'! Nie wiedziałem o tym. – ccellar

+0

nie ma za co :) – Rob