Как я могу настроить log4net, чтобы мои файлы регистрировались в разных папках каждый день?

  1. Я хочу сохранять все журналы в течение каждого дня в папке с именем YYYYMMdd - log4net должен обрабатывать создание новой папки в зависимости от системного datetime - как я могу это настроить?
  2. Я хочу сохранить все журналы в течение дня в n файлов размером 1 МБ - я не хочу переписывать старые файлы, но действительно хочу иметь все журналы в течение одного дня - как я могу это настроить?

Я использую C #

С уважением, Алекс


person halex    schedule 05.03.2010    source источник


Ответы (5)


Попробуйте это (все должно быть в порядке!):

<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
  <file value="logs\\" />
  <appendToFile value="true" />
  <DatePattern value="yyyy\\\\MM\\\\dd'.inf.log'" />
  <rollingStyle value="Date" />
  <param name="StaticLogFileName" value="false" />
  <layout type="log4net.Layout.PatternLayout">
    <header value="[Header]&#13;&#10;" />
    <footer value="[Footer]&#13;&#10;" />
    <conversionPattern value="%date [%thread] %-5level %logger [%ndc] &lt;%property{auth}&gt; - %message%newline" />
  </layout>
</appender>

Будет создан файл журнала с именем 'logs \ 2010 \ 04 \ 02.inf.log' (пусть дата будет 2010-04-02).

person he_king    schedule 02.04.2010
comment
что означают одинарные кавычки? '.inf.log' - person Sean B; 20.04.2017
comment
работает отлично, просто примечание, достаточно двойной обратной косой черты. <file value="logs\" /> и <DatePattern value="yyyy\\MM\\dd'.inf.log'" /> должны работать нормально. - person Ravi M Patel; 09.08.2017
comment
Я думаю, вам нужно использовать <file value="logs\\" /> и <DatePattern value="yyyy\\\\MM\\\\dd'.inf.log'" />, чтобы избежать `` в противном случае он выйдет из первого 'M' и первого 'd' - person Carlos; 17.05.2018

Спасибо вам всем. Мы создали SortByFolderFileAppender, унаследованный от RollingFileAppender

Пример конечного результата: где-то \ Logs \ 20100305 \ Client-104615.0

namespace CustomLogging
{
  public class SortByFolderFileAppender : log4net.Appender.RollingFileAppender
  {
    protected override void OpenFile(string fileName, bool append)
    {
      //Inject folder [yyyyMMdd] before the file name
      string baseDirectory = Path.GetDirectoryName(fileName);
      string fileNameOnly = Path.GetFileName(fileName);
      string newDirectory = Path.Combine(baseDirectory, DateTime.Now.ToString("yyyyMMdd"));
      string newFileName = Path.Combine(newDirectory, fileNameOnly);

      base.OpenFile(newFileName, append);
    }
  }
}
<appender name="SortByFolderFileAppender" type="CustomLogging.SortByFolderFileAppender">
  <file type="log4net.Util.PatternString" value="Logs\Client"/>
  <appendToFile value="true"/>
  <rollingStyle value="Composite"/>
  <datePattern value="-HHmmss"/>
  <maxSizeRollBackups value="40"/>
  <maximumFileSize value="1MB"/>
  <countDirection value="1"/>
  <encoding value="utf-8"/>
  <staticLogFileName value="false"/>
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date{HH:mm:ss.fff}|%-5level|%message%newline"/>
  </layout>
</appender>
person halex    schedule 05.03.2010
comment
Возможно ли в OpenFile действительно добавить в текущий журнал? Я бы хотел таким образом добавить пару сообщений в свой пользовательский аппендер. - person Matthew Lock; 27.09.2012
comment
Мне удалось записать что-то в stderr с помощью LogLog.Warn / LogLog.Error, но, возможно, методы log4net не могут получить доступ к текущему журналу? - person Matthew Lock; 27.09.2012
comment
Это решение не будет работать должным образом, если для staticLogFileName установлено значение True. В моем случае мне нужны разные папки на каждый день, но с одним и тем же именем внутри. Если для этого свойства установлено значение true, log4net копирует файл в папку, указанную для свойства File приложения, а внедренная папка остается пустой! - person XMight; 01.10.2014
comment
Я просмотрел исходный код log4net, и мне кажется, что нет возможности обойти то, что я написал выше. Только установите для static значение true, а после этого обработайте файлы и удалите шаблон даты из их имени. - person XMight; 01.10.2014
comment
Кроме того, если вы измените некоторые параметры из кода в регистраторе и вызовете ActivateOptions в appender, это решение добавит новое имя папки в путь, например: logs \ 23-03-2014 \ 23-03-2014 \ 23-03- 2014 ... и так с каждым звонком. Будьте осторожны с этим! - person XMight; 06.10.2014

Я считаю, что вы можете создать свой собственный аппендер на основе класса FileAppender. Возможно, вам потребуется переопределить метод OpenFile, чтобы создать файл в нужном месте.

person Kerido    schedule 05.03.2010

Вы можете использовать приложение Rollinglogfileappender, которое создает файлы с именами по дате и запускает новый файл в полночь. Затем просто напишите сценарий, который перемещает их на правильную карту в 00.01.

Что касается записи всех файлов в течение одного дня с максимальным размером 1 МБ на файл, вот пример:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString" value="Logging\\MWLog"/>
  <appendToFile value="true"/>
  <rollingStyle value="Composite"/>
  <datePattern value="-yyyyMMdd"/>
  <maxSizeRollBackups value="-1"/>
  <maximumFileSize value="1MB"/>
  <countDirection value="1"/>
  <encoding value="utf-8"/>
  <staticLogFileName value="false"/>
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date{HH:mm:ss.fff}|%-5level|%message%newline"/>
  </layout>
</appender>
person Carra    schedule 05.03.2010

Чтобы построить из приведенного выше ответа, используя SortByFolderFileAppender.

Вот как мы решили проблему, используя скользящую дату для имен файлов журналов. Я изменил staticLogFileName на true, чтобы все имя файла передавалось в метод OpenFile.

Если имя файла заканчивается на «.log», то ничего добавлять не нужно. Я предполагаю, что произошла какая-то блокировка, и я хочу, чтобы log4net снова попытался использовать то же имя файла, надеясь, что предыдущая блокировка была снята.

Хотя я не уверен, может ли это привести к бесконечному вызову OpenFile, если файл заблокирован и не отпускает его. Мы создали веб-сервис, используя шаблон производителя-потребителя, чтобы регистрировать все в одном месте из всех приложений в системе, которых в настоящее время насчитывается десять и растет.

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

Результат для имени файла - «Logs \ Client \ 2017 \ 11 \ 08.log» и, очевидно, меняется каждый день.

protected override void OpenFile( string fileName, bool append )
{
    // append "\yyyy\mm\dd.log" to create the correct filename.
    if ( !fileName.EndsWith( ".log") )
        fileName = $@"{fileName}\{DateTime.Now:yyyy\\MM\\dd}.log";

    base.OpenFile( fileName, append );
}

Модификация конфигурации сверху.

<appender name="xxxRollingFileAppender" type="namespace.xxxRollingFileAppender">
    <file value="Logs\Client"/>
    <staticLogFileName value="true"/>
    <appendToFile value="true"/>
    <maxSizeRollBackups value="40"/>
    <maximumFileSize value="1MB"/>
    <encoding value="utf-8"/>
    <layout type="log4net.Layout.PatternLayout">
       <conversionPattern value="%date{HH:mm:ss.fff}|%-5level|%message%newline"/>
    </layout>
</appender>
person kdahl    schedule 08.11.2017