Налаштуйте Log4net для запису в кілька файлів


130

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

це можливо зробити за допомогою log4net?

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


3
Ви не можете увійти до окремих додатків - вам потрібно налаштувати різні реєстратори та приєднати відповідне додаток до кожного. Потім введіть різні повідомлення в різні реєстратори.
Vinay Sajip

Ось як я це зробив із кодовою конфігурацією: stackoverflow.com/questions/27846157/…
Jay Sullivan

Відповіді:


82

Так, просто додайте до свого реєстратора кілька файлових додатків. Наприклад:

<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

2
@ ofer- дивіться мою відповідь про те, як це зробити.
RichardOD

1
Що робити, якщо ви хочете, щоб File1Appender реєстрував помилки DEBUG, а File2Appender входив до помилок ERROR?
JsonStatham

Я намагаюся досягти подібних речей. Буду рада, якщо ви зможете відповісти на моє запитання: stackoverflow.com/questions/24886364/…
Ashish Charan

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 буде містити "Обробку" ... і \ SummaryFile.log міститиме "Processing2"


58
Я просто хотів звернути увагу на атрибут addibility = "false" на реєстраторі, який заважає всьому входити в корінь.
Джейсон Ернандес

1
Це чудовий приклад потужності log4net. Дякую!
розчавити

5
Наведена вище конфігурація відсутня <layout> ... </layout>, без неї я не бачив жодного повідомлення у файлі журналу.
CrnaStena

@CrnaStena Ви впевнені, що це єдина зміна, яку ви внесли?
Гері

1
@Craig Дивіться це запитання, щоб дізнатися більше про те, як користуватися цим: stackoverflow.com/questions/1999382/…
Gary

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);

Прочитайте розділ документації та реєстраторів додатків, щоб зрозуміти, як це працює.


3
У мене така сама установка в одному з моїх додатків, і це не працює для мене :(
Román

1
Ця дискусія дуже стара ... сподіваюся, ви зможете відповісти ... Я спробував ваш підхід, але два реєстратори записують однакові повідомлення. Як і в log.Info ("") та otherLog.Info ("") записуйте повідомлення в обидва файли журналу одночасно.
SutharMonil

1
@daniel_aren Так, що я зробив, я використовував блок додатка, щоб створити два додатки з окремими шляхами файлів (так само, як і вище цього) .... так ефективно ми маємо два додаткові блоки з іменами: fileappender1 та fileappender2 ... .
SutharMonil

1
@SutharMonil просто додайте "additive =" false "до вузла реєстратора, як у відповіді Гері та підкреслив Джейсон Ернандес. У цьому випадку він все-таки помістить усі повідомлення в root, але лише повідомлення від otherLog.Info ("") з'являться у File1Appender2
Freedomn-m

На сьогодні найточніша відповідь.
Fabricio

41

Я хотів записати всі повідомлення до root logger та мати окремий журнал із помилками, ось як це можна зробити:

<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");

Ви можете додати два або більше елементів додатка всередині кореневого елемента log4net для входу в кілька файлів.

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

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

Сподіваюсь, це допоможе.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.