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