Использование NLOG в качестве файла выпуская файла

StackOverflow https://stackoverflow.com/questions/3000653

  •  25-09-2019
  •  | 
  •  

Вопрос

Как это возможно - могу ли я использовать NLOG в качестве файла файла Rollover? как будто:

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

debug-2010-06-08.log

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top