NLog вращать и очищать лог-файлы - PullRequest
27 голосов
/ 07 ноября 2011

В моей компании мы работаем с NLog.У нас возникли проблемы с большим количеством файлов журналов.Что мы хотим сделать, так это архивировать файлы по дням и хранить не более x файлов.Давайте скажем 7. Я прочитал несколько тем в интернете по этому поводу, и они в основном указывают мне в том же направлении изменения моего файла NLog.config.Однако, похоже, он не хочет поворачивать файлы, как я ожидаю.В данный момент в нужной папке ничего не архивируется.Но все файлы сохраняются в каталоге «logs» в следующем формате:

Log.info.2011-11-07.txt

В моем приложении у меня есть каталог «logs».Внутри этой папки все лог-файлы сохраняются.У меня также есть папка под названием «архивы», в которой я хочу архивировать все старые файлы.После того, как в этом каталоге будет достигнуто максимальное количество файлов журнала, они должны быть автоматически очищены.Это возможно?Мой текущий файл NLog.config выглядит следующим образом:

<?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="someone@mail.com" 
            smtpServer="mail.server.com" 
            from="no-reply@errormail.com"/>
    <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>

РЕДАКТИРОВАТЬ: Окончательное (отрывное) решение после ответа Ckellers.

1 Ответ

16 голосов
/ 07 ноября 2011

Похоже, проблема в shortdate в определении вашего имени файла.Смотрите мой ответ на этот вопрос: Удалить файлы журнала через x дней

Вы должны определить имя файла без даты части

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