Использование NLog в качестве ролловера - PullRequest
19 голосов
/ 08 июня 2010

Как, если возможно, я могу использовать NLog в качестве средства переноса файлов? как будто:

Я хочу иметь не более 31 файла в течение 31 дня, и когда начался новый день, если есть файл журнала старого дня ##. Log, он должен быть удален, но в течение этого дня все журналы добавляются и там минимум на 27 дней.

Ответы [ 2 ]

26 голосов
/ 19 июля 2013

Наконец-то я остановился на архивировании файлов на основе размера .Я использую трюк, чтобы присвоить файлу имя только после дня месяца, и мне потребовалась архивация файлов на основе размера, потому что это действительно помогает, когда размер журналов начинает превышать несколько сотен мегабайт.Например, он позволяет создавать 20 МБ фрагментов журнала, поэтому можно легко взглянуть на него с помощью легковесного инструмента, такого как Notepad ++.

Он работает уже почти год.Вот упрощенная версия моего 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>

Эта конфигурация создает 1 МБ файл журнала для каждого дня месяца и хранит не более 10 архивированных блоков по 1 МБ журнала в папке My Documents\MyApp\Log;как 29.log, 30.log и 31.log.

Редактировать: В течение некоторого времени я использую этот файл NLog.config, и он охватывает почти все случаи, которые мне нужны.У меня разные уровни ведения журналов от разных классов в отдельных файлах, и когда они станут большими, они будут архивироваться в зависимости от размера почасовым способом:

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

И в каждом классе, который мне нуженфункциональность регистрации, я поставил это:

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

Два дополнительных регистратора для ежедневного накопления некоторых данных и записи в журнал событий Windows;которые являются регистраторами всего приложения:

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

И они должны быть инициализированы при запуске приложения:

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

Примечание. Иногда при выходе из приложения вы получаете исключение, созданное NLog.Это потому, что то, что не инициализировано, не может быть утилизировано!Вы только что записали пустую запись в свой регистратор при запуске приложения, скажем:

DataLog.Info(string.Empty);

Я добавил это ограничение размера, чтобы файл журнала можно было просматривать в (скажем) Блокноте на низкоуровневом сервере, длябыстрые обзоры.Вы должны изменить их в соответствии с вашими потребностями.

11 голосов
/ 08 июня 2010

Я бы предложил разделить проблему на два разных аспекта:

  • Переход на новое имя файла каждый день (имейте в виду часовой пояс; возможно, день UTC?)
  • Удаление старых файлов журнала

По моему опыту было бы целесообразно сохранить дату в имени файла журнала, например,

debug-2010-06-08.log

Эта часть должна быть легкой с NLog, учитывая примеры в документации .

Теперь вторую часть можно легко выполнить во втором потоке или, возможно, даже в совершенно ином процессе - нужно просто посмотреть, сколько файлов присутствует и удалитьсамые старые, если это необходимо.Найти «самый старый» должно быть легко, если дата находится в имени файла, даже если вы не хотите доверять информации о файловой системе.

На самом деле, глядя на документацию NLog, она выглядит как «архивация файлов на основе времени» target может делать именно то, что вы хотите ... но даже если это не так, обычный подход «один файл журнала в день» и выполнение собственной очистки должны быть простыми.

...