Как зарегистрировать разные уровни журнала для разных приложений в log4net - PullRequest
18 голосов
/ 14 июня 2011

У меня есть WinForm, которая отображает информацию журнала, но я хочу, чтобы она отображалась только на уровне INFO, но я хочу, чтобы журнал в файле журнала также содержал уровень DEBUG.

Ниже моя конфигурация:

<?xml version="1.0" encoding="utf-8" ?>
<!-- This section contains the log4net configuration settings -->
<log4net>
  <!-- Define some output appenders -->

  <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="${ALLUSERSPROFILE}\\Application Data\\logs\\Gateway" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <param name="StaticLogFileName" value="false" />
    <datePattern value=".yyyyMMdd.lo\g" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date | [%thread] | %-5level | %logger | %message %newline" />
    </layout>
  </appender>

  <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    </layout>
  </appender>

  <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
    <mapping>
      <level value="DEBUG" />
      <backColor value="Blue" />
    </mapping>
    <mapping>
      <level value="INFO" />
      <backColor value="Green" />
    </mapping>
    <mapping>
      <level value="WARN" />
      <backColor value="Yellow" />
    </mapping>
    <mapping>
      <level value="ERROR" />
      <backColor value="Red" />
    </mapping>
    <mapping>
      <level value="FATAL" />
      <backColor value="Red, HighIntensity" />
    </mapping>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>

  <appender name="RichTextBoxAppender" type="Gateway.RichTextBoxAppender,Gateway" >
    <layout type="log4net.Layout.PatternLayout">
      <param name="Header" value="[Header]\r\n"/>
      <param name="Footer" value="[Footer]\r\n"/>
      <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
    </layout>
    <mapping>
      <level value="DEBUG" />
      <textColorName value="DarkGreen" />
    </mapping>
    <mapping>
      <level value="INFO" />
      <textColorName value="ControlText" />
    </mapping>
    <mapping>
      <level value="WARN" />
      <textColorName value="Blue" />
    </mapping>
    <mapping>
      <level value="ERROR" />
      <textColorName value="Red" />
      <bold value="true" />
      <pointSize value="10" />
    </mapping>
    <mapping>
      <level value="FATAL" />
      <textColorName value="Black" />
      <backColorName value="Red" />
      <bold value="true" />
      <pointSize value="12" />
      <fontFamilyName value="Lucida Console" />
    </mapping>
  </appender>


  <!-- Setup the root category, add the appenders and set the default level -->
  <root>
    <level value="WARN" />
    <appender-ref ref="LogFileAppender" />
    <appender-ref ref="ColoredConsoleAppender" />
    <appender-ref ref="RichTextBoxAppender" />
  </root>

  <logger name ="Gateway" additivity="false">
    <level value="INFO" />
    <appender-ref ref="LogFileAppender" />
    <appender-ref ref="ColoredConsoleAppender" />
    <appender-ref ref="RichTextBoxAppender" />
  </logger>



</log4net>

Прямо сейчас для INFO для LogFileAppender и RichTextBoxAppender установлено значение INFO. Я попытался вынуть LogFileAppender в логгере шлюза и перейти к другому логгеру и установить уровень «DEBUG» для этого нового логгера, но он все еще делает одно или другое. Как настроить его так, чтобы LogFileAppender имел уровень DEBUG, а RichTextBoxAppender имел уровень INFO?

Ответы [ 2 ]

31 голосов
/ 14 июня 2011

Вы должны иметь возможность добавить фильтр для обоих ваших дополнений.

<filter type="log4net.Filter.LevelRangeFilter">
         <levelMin value="INFO" />
         <levelMax value="FATAL" />
</filter>

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

27 голосов
/ 21 июня 2011

Я согласен с @gwhitake, что вы можете использовать фильтр диапазона уровней.Однако я также хочу добавить, что вы можете использовать фильтр LevelMatch, если вы просто хотите выбрать один уровень.Этот фильтр также позволяет вам добавить еще один фильтр в конце, чтобы вы могли создать фильтр с двумя или более уровнями, даже если они не расположены рядом друг с другом в порядке.

Например,следующий фильтр будет захватывать только сообщения DEBUG и ERROR (просто в качестве примера):

<filter type="log4net.Filter.LevelMatchFilter">
  <levelToMatch value="DEBUG"/>
</filter>
<filter type="log4net.Filter.LevelMatchFilter">
  <levelToMatch value="ERROR"/>
</filter>
<filter type="log4net.Filter.DenyAllFilter" />

Единственный ключ здесь заключается в том, что нам нужно иметь DenyAllFilter в конце.Это говорит регистратору, что если он достигает этой строки, не регистрируйте его.Таким образом он будет регистрировать сообщения отладки, сообщения об ошибках и ничего больше.

Существует множество способов манипулировать фильтром, чтобы получить именно то, что вы хотите.Вот статья (полный отказ от ответственности: я написал ее), в которой показано, как сделать с фильтром множество разных вещей, помимо диапазона уровней:

http://www.codeproject.com/KB/dotnet/Log4net_Tutorial.aspx

...