С помощью log4net вы указываете, какое приложение использовать?

#c# #log4net

#c# #log4net

Вопрос:

Когда у вас есть 2 приложения, скажем, одно для ошибок отладки и одно для ошибок продукта, в вашем коде, вы явно создаете 2 класса журналов или приложение в основном будет записывать любые сообщения журнала, которые соответствуют определенным критериям?

Итак, в вашем коде вы используете единый метод ведения журнала, и в зависимости от того, как настроены ваши приложения, оно будет регистрировать сообщение, если оно, например, зарегистрировано из определенного пространства имен или имеет определенный уровень журнала.

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

Ответ №1:

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

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

  <log4net>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="c:logsMySite"/>
      <appendToFile value="true"/>
      <datePattern value=".yyyy-MM-dd.log"/>
      <rollingStyle value="Date"/>
      <MaxSizeRollBackups value="14"/>
      <param name="StaticLogFileName" value="false"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%d{HH:mm:ss.fff} [%thread] %-5level %logger{1} - %m%n"/>
      </layout>
    </appender>
    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
      <applicationName value="Trading.Web"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%d{HH:mm:ss.fff} [%thread] %-5level %logger{1} - %m%n"/>
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="WARN"/>
        <param name="LevelMax" value="ERROR"/>
      </filter>
    </appender>
    <root>
      <level value="DEBUG"/>
      <appender-ref ref="RollingFileAppender"/>
      <appender-ref ref="EventLogAppender" />
    </root>
  </log4net>
 

Итак, это:

   _log.Debug("This is a debug message");
 

Будет отображаться только в файле журнала (поскольку он не соответствует критериям фильтрации приложения журнала событий).

Но это:

   _log.Error("This is an error message.");
 

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

ОБНОВЛЕНИЕ: на ваш вопрос о фильтрации, если у вас:

 <root>
  <level value="DEBUG"/>
  <appender-ref ref="RollingFileAppender"/>
</root>

<!-- Print only messages of level WARN or above in the namespace Com.Foo -->
<logger name="Com.Foo">
    <level value="WARN" />
</logger>
 

Затем все вещи под Com.Foo будет регистрироваться, если WARN или выше, но все остальное будет регистрироваться при DEBUG или выше….

Комментарии:

1. таким образом, вы также можете устанавливать уровни журнала по пространству имен? должен ли корень иметь этот уровень журнала или root может быть ОШИБКОЙ, в то время как для журнала, определенного для пространства имен, может быть установлено значение INFO?

2. @codecompleting: вы можете выполнить очень подробную фильтрацию. Root — это просто поведение ведения журнала на базовом уровне, если другое, более конкретное, не превосходит его. Смотрите Обновление выше.