Наконец-то я остановился на архивировании файлов на основе размера .Я использую трюк, чтобы присвоить файлу имя только после дня месяца, и мне потребовалась архивация файлов на основе размера, потому что это действительно помогает, когда размер журналов начинает превышать несколько сотен мегабайт.Например, он позволяет создавать 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);
Я добавил это ограничение размера, чтобы файл журнала можно было просматривать в (скажем) Блокноте на низкоуровневом сервере, длябыстрые обзоры.Вы должны изменить их в соответствии с вашими потребностями.