Настройка Log4Net для определенных классов и чрезмерная обработка ошибок - PullRequest
0 голосов
/ 14 мая 2019

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

В моем приложенииУ меня есть несколько "рабочих".Я бы хотел, чтобы у каждого работника был свой собственный файл журнала для записи отладочных сообщений.Если я получаю сообщение отладки, которое не записано на конкретном работнике, я бы хотел, чтобы оно было записано в центральный файл отладки.Я также хотел бы иметь централизованное ведение журнала ошибок, где все ошибки от любого из работников записываются в один и тот же файл.

У меня возникают трудности с определением конфигурации XML для этого.Вот самое близкое, что я получил:

  <log4net>
    <appender name="DebugLog" type="log4net.Appender.RollingFileAppender">
      <file value="logs\debug.log" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <datePattern value="ddMMyyyy" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="DEBUG" />
        <levelMax value="FATAL" />
      </filter>
    </appender>
    <appender name="ErrorLog" type="log4net.Appender.RollingFileAppender">
      <file value="logs\error.log" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <datePattern value="ddMMyyyy" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline%stacktrace{1}%newline" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="ERROR" />
        <levelMax value="FATAL" />
      </filter>
    </appender>
    <appender name="Worker1" type="log4net.Appender.RollingFileAppender">
      <file value="logs\Worker1.log" />
      <appendToFile value="true" />
      <rollingStyle value="Composite" />
      <datePattern value="ddMMyyyy" />
      <maxSizeRollBackups value="100" />
      <maximumFileSize value="100MB" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="DEBUG" />
        <levelMax value="INFO" />
      </filter>
    </appender>
    <appender name="Worker2" type="log4net.Appender.RollingFileAppender">
      <file value="logs\Worker2.log" />
      <appendToFile value="true" />
      <rollingStyle value="Composite" />
      <datePattern value="ddMMyyyy" />
      <maxSizeRollBackups value="100" />
      <maximumFileSize value="100MB" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="DEBUG" />
        <levelMax value="INFO" />
      </filter>
    </appender>
    <appender name="Worker3" type="log4net.Appender.RollingFileAppender">
      <file value="logs\3.log" />
      <appendToFile value="true" />
      <rollingStyle value="Composite" />
      <datePattern value="ddMMyyyy" />
      <maxSizeRollBackups value="100" />
      <maximumFileSize value="100MB" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="DEBUG" />
        <levelMax value="INFO" />
      </filter>
    </appender>
    <root>
      <level value="DEBUG" />
      <appender-ref ref="DebugLog" />
      <appender-ref ref="ErrorLog" />
    </root>
    <logger name="Worker1">
      <level value='DEBUG'/>
      <appender-ref ref="Worker1" />
    </logger>
    <logger name="Worker2">
      <level value='DEBUG'/>
      <appender-ref ref="Worker2" />
    </logger>
    <logger name="Worker3">
      <level value='DEBUG'/>
      <appender-ref ref="Worker3" />
    </logger>
  </log4net>

Первая проблема, с которой я столкнулся, заключается в том, что все сообщения, записанные в класс Worker1, записываются в файл Debug.log и файл Worker1.log.Я не хочу, чтобы они записывались в Debug.log, если они уже записаны в Worker1.log.

Я могу обойти это, изменив раздел, добавив additivity = false.В этом случае он записывает в журнал Worker1.log, а не в файл Debug.log.

Тем не менее, это предотвращает запись ошибок в Error.log. Что происходит, если я устанавливаю additivity = "false"и регистрируйте ошибку, она записывается в Worker1.log, но не записывается в Error.log.

Есть ли способ применить аддитивность только к сообщениям отладки / информации, чтобы яможет иметь сообщения отладки в Worker1.log, сообщения об ошибках в Error.log и любые сообщения отладки, которые не относятся к регистратору в файле debug.log?

1 Ответ

0 голосов
/ 14 мая 2019

Вы правы относительно установки additivity="false" для выделения debug сообщений на Worker1.log.

Чтобы вернуть error сообщения Worker1 обратно в Error.log, вы также должны включить аппендер ErrorLog в декларацию Worker1 logger, как показано ниже.

<logger name="Worker1" additivity="false">
    <level value='DEBUG'/>
    <appender-ref ref="Worker1" />
    <appender-ref ref="ErrorLog" />
</logger>

Посредством этой настройки вы отменяете правила, определенные в root, чтобы использовать пользовательские Worker1 Appender для debug сообщений и те же самые Error Appender для error сообщений.

...