Используя NLog как переключение файлов регистратора
как-если возможно - могу ли я использовать NLog в качестве регистратора файлов опрокидывания? как будто:
Я хочу иметь не более 31 файлов в течение 31 дня и когда начался новый день,если есть старый файл журнала##.журнал, затем он должен быть удален, но в течение этого дня все журналы добавляются и будут там, по крайней мере, в течение 27 дней.
2 ответов
наконец-то я рассчитался с архивирование файлов на основе размера. Я использую трюк, чтобы назвать файл только после дня месяца, и мне нужен архивный файл на основе размера, потому что это действительно помогает, когда ваши журналы начинают расти за несколько сотен мегабайтов. Это помогает сделать, например, 20 МБ кусков журнала, поэтому можно легко быстро взглянуть на него с помощью легкого инструмента, такого как Notepad++.
он работает уже почти год. Вот упрощенная версия my :
<?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 MB для каждого дня месяца и сохраняет не более 10 архивированных блоков журнала 1 MB в ; как 29.log
, 30.log
и 31.log
.
Edit: некоторое время я использую это 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);
я добавил Это ограничение размера, поэтому файл журнала можно просмотреть в (скажем) блокноте на сервере низкого уровня для быстрых обзоров. Вы должны изменить их в зависимости от ваших потребностей.
Я бы предложил вам разделить проблему на два разных аспекта:
- переход на новое имя файла каждый день (имейте в виду часовой пояс; возможно, день UTC?)
- удаление старых файлов журнала
по моему опыту, стоит сохранить дату в имени файла журнала, например
debug-2010-06-08.log
эта часть должна быть легкой с NLog, учитывая примеры в документации.
теперь вторая часть может легко сделайте это во втором потоке или, возможно, даже в совершенно другом процессе - ему просто нужно увидеть, сколько файлов присутствует и удалить самые старые, если это необходимо. Найти "самый старый" должно быть легко, если дата находится в имени файла, даже если вы не хотите доверять информации файловой системы.
на самом деле, глядя на документацию NLog, это выглядит как "архивирование файлов на основе времени" target может делать именно то, что вы хотите... но даже если это не так, нормальный " один log file per day " подход и прокатка вашей собственной очистки должны быть легкими.