Настройте Log4net для записи в несколько файлов

130

Я хотел бы записать журнал в 2 разных файла журнала одного и того же процесса.

это возможно сделать с помощью log4net?

Мне нужно будет писать отдельные сообщения в каждый файл журнала. как я могу написать сообщение конкретному приложению?

Офер
источник
3
Вы не можете войти в отдельные приложения - вам нужно настроить разные регистраторы и прикрепить соответствующий appender к каждому из них. Затем записывайте разные сообщения в разные регистраторы.
Vinay Sajip
Вот как я сделал это с помощью кода как конфигурации: stackoverflow.com/questions/27846157/…
Джей Салливан,

Ответы:

82

Да, просто добавьте несколько FileAppenders в свой регистратор. Например:

<log4net>
    <appender name="File1Appender" type="log4net.Appender.FileAppender">
        <file value="log-file-1.txt" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date %message%newline" />
        </layout>
    </appender>
    <appender name="File2Appender" type="log4net.Appender.FileAppender">
        <file value="log-file-2.txt" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date %message%newline" />
        </layout>
    </appender>

    <root>
        <level value="DEBUG" />
        <appender-ref ref="File1Appender" />
        <appender-ref ref="File2Appender" />
    </root>
</log4net>
Винай Саджип
источник
5
Хорошо .. :) Однако мне нужно будет писать отдельные сообщения в каждый файл журнала. как я могу написать сообщение конкретному приложению? Спасибо. ofer
ofer 03
2
@ ofer - см. мой ответ, как это сделать.
RichardOD 03
1
Что если вы хотите, чтобы File1Appender регистрировал ошибки DEBUG, а File2Appender регистрировал ошибки ERROR?
JsonStatham
Я пытаюсь добиться того же. Буду рад, если вы ответите на мой вопрос: stackoverflow.com/questions/24886364/…
Ашиш Чаран
202

Эти ответы были полезны, но я хотел поделиться своим ответом как с частью app.config, так и с частью кода C #, чтобы у следующего человека было меньше догадок.

<log4net>
  <appender name="SomeName" type="log4net.Appender.RollingFileAppender">
    <file value="c:/Console.txt" />
    <appendToFile value="true" />
    <rollingStyle value="Composite" />
    <datePattern value="yyyyMMdd" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="1MB" />
  </appender>
  <appender name="Summary" type="log4net.Appender.FileAppender">
    <file value="SummaryFile.log" />
    <appendToFile value="true" />
  </appender>
  <root>
    <level value="ALL" />
    <appender-ref ref="SomeName" />
  </root>
  <logger additivity="false" name="Summary">
    <level value="DEBUG"/>
    <appender-ref ref="Summary" />
  </logger>
</log4net>

Затем в коде:

ILog Log = LogManager.GetLogger("SomeName");
ILog SummaryLog = LogManager.GetLogger("Summary");
Log.DebugFormat("Processing");
SummaryLog.DebugFormat("Processing2"));

Здесь c: /Console.txt будет содержать "Processing" ... и \ SummaryFile.log будет содержать "Processing2"

Gary
источник
58
Я просто хотел обратить внимание на атрибут additivity = "false" в регистраторе, который предотвращает регистрацию всего в корне.
Джейсон Эрнандес
1
Это отличный пример возможностей log4net. Спасибо!
раздавить
5
Вышеуказанная конфигурация отсутствует <layout> ... </layout>, без нее я не видел никаких сообщений в файле журнала.
CrnaStena
@CrnaStena Вы уверены, что это единственное изменение, которое вы сделали?
Гэри
1
@Craig См. Этот вопрос, чтобы узнать больше об этом: stackoverflow.com/questions/1999382/…
Гэри
60

Винай прав. Отвечая на ваш комментарий в его ответе, вы можете сделать это следующим образом:

<root>
    <level value="ALL" />
    <appender-ref ref="File1Appender" />
</root>
<logger name="SomeName">
    <level value="ALL" />
    <appender-ref ref="File1Appender2" />
</logger>

Так я делал это раньше. Тогда что-то вроде этого для другого журнала:

private static readonly ILog otherLog = LogManager.GetLogger("SomeName");

И вы можете получить свой обычный регистратор следующим образом:

private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

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

RichardOD
источник
3
У меня такая же настройка в одном из моих приложений, и у меня она не работает :(
Román
1
Это обсуждение очень старое ... надеюсь, вы сможете ответить ... Я попробовал ваш подход, но два регистратора регистрируют одни и те же сообщения. Как и в log.Info ("") и otherLog.Info ("") сообщения записываются в оба файла журнала одновременно.
SutharMonil
1
@daniel_aren Да, я сделал то, что я использовал блок appender, чтобы создать два appender с отдельными путями к файлам (точно так же, как тот, что выше этого) .... так что эффективно у нас есть два блока appender с именами: fileappender1 и fileappender2 ... .
SutharMonil
1
@SutharMonil просто добавьте 'additivity = "false" в узел регистратора, как в ответе Гэри и выделено Джейсоном Эрнандесом. В этом случае он по-прежнему помещает все сообщения в корень, но только сообщения из otherLog.Info ("") будут появляться в File1Appender2
freedomn-m
Безусловно, самый точный ответ.
Фабрицио,
41

Я хотел регистрировать все сообщения в корневом регистраторе и иметь отдельный журнал с ошибками, вот как это можно сделать:

<log4net>
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
        <file value="allMessages.log" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date  %-5level %logger  - %message%newline" />
        </layout>
    </appender>

    <appender name="ErrorsFileAppender" type="log4net.Appender.FileAppender">
        <file value="errorsLog.log" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date  %-5level %logger  - %message%newline" />
        </layout>
        <filter type="log4net.Filter.LevelRangeFilter">
            <levelMin value="ERROR" />
            <levelMax value="FATAL" />
        </filter>
    </appender>

    <root>
        <level value="ALL" />
        <appender-ref ref="FileAppender" />
        <appender-ref ref="ErrorsFileAppender" />
    </root>
</log4net>

Обратите внимание на использование фильтрующего элемента.

Валентин Кузуб
источник
0

Используйте приведенную ниже конфигурацию XML для настройки журналов в два или более файлов,

<log4net>
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="logs\log.txt" />         
      <appendToFile value="true" /> 
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">           
        <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
      </layout>
    </appender>
     <appender name="RollingLogFileAppender2" type="log4net.Appender.RollingFileAppender">
      <file value="logs\log1.txt" />         
      <appendToFile value="true" /> 
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">        
        <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
      </layout>
    </appender>
    <root>
      <level value="All" />
      <appender-ref ref="RollingLogFileAppender" />
    </root>
     <logger additivity="false" name="RollingLogFileAppender2">
    <level value="All"/>
    <appender-ref ref="RollingLogFileAppender2" />
    </logger>
  </log4net>

Вышеуказанная конфигурация XML записывается в два разных файла.

Чтобы программно получить конкретный экземпляр регистратора,

ILog logger = log4net.LogManager.GetLogger ("RollingLogFileAppender2");

Вы можете добавить два или более элемента appender в корневой элемент log4net для входа в несколько файлов.

Дополнительная информация о приведенной выше структуре конфигурации XML или о том, какое приложение лучше всего подходит для вашего приложения, Подробнее читайте по ссылке ниже,

https://logging.apache.org/log4net/release/manual/configuration.html https://logging.apache.org/log4net/release/sdk/index.html

Надеюсь, это поможет.

Ракеш Чаудхари
источник