файл журнала на основе даты без повторного использования при запуске

У меня есть пакетный процесс, который я хочу записать в MyProcess.YYYYMMDD.log. Обычно он запускается ежедневно, но иногда из-за сбоев или тестирования запускается несколько раз в день. Основываясь на других вопросах log4net, я использую RollingLogFileAppender для создания файлов на основе даты. Однако, если несколько запусков происходят в один и тот же день, я получаю, что эти несколько запусков записываются в один и тот же файл.

В идеале я хотел бы, чтобы первый запуск пакетного процесса регистрировался в MyProcess.YYYYMMDD.log, а второй запуск в тот же день - в MyProcess.YYYYMMDD.2.log и т. Д.

Как проще всего добиться этого с помощью log4net?

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

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
  <file value="MyProcess.log" />
  <appendToFile value="true" />
  <rollingStyle value="Date" />
  <datePattern value=".yyyyMMdd" />
  <staticLogFileName value="false"/>
  <PreserveLogFileNameExtension value="true"/>
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
  </layout>
</appender>

person RationalGeek    schedule 11.07.2012    source источник


Ответы (2)


Не уверен, что вы можете добавить инкрементную переменную к отметке даты вашего журнала. Возможно, лучший способ - добавить метку времени к имени файла, чтобы вы могли таким образом отличить его.

Эта ссылка здесь дает хорошее объяснение того, как добавить необходимые свойства для реализации отметки времени. Если вы не хотели регистрироваться до минуты, вы можете выбрать вместо этого просто текущий час.

person Ken Cenerelli    schedule 11.07.2012
comment
Да, я думал об этом, но, к сожалению, этот процесс может длиться несколько часов, и я не хочу, чтобы один запуск разбивался на несколько файлов. Спасибо за информацию. - person RationalGeek; 11.07.2012

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

например, при запуске перед регистрацией чего-либо установите имя файла журнала, например

var logfileName = String.Format("{0}{1:yyyyMMdd}.log" , 
                 ".\logs\MyProcess" , DateTime.Now );

Затем вы проверяете, существует ли уже файл журнала, и если да, то изменяете logfileName, пока не получите уникальное имя.

Затем вы передаете эту информацию в log4net как в.

log4net.GlobalContext.Properties["LogName"] = logfileName;

Это необходимо сделать до того, как будет записано первое сообщение.

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

<file type="log4net.Util.PatternString" value="%property{LogName}" />
person sgmoore    schedule 11.07.2012
comment
Применяется ли свойство LogName ко всем приложениям или только к RollingFileAppender? - person RationalGeek; 13.07.2012