Как регистрировать различные уровни журналов для разных приложений журналов в log4net
У меня есть 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. Я попытался вытащить LogFileAppender в журнале шлюза и переместиться на другой регистратор и установить уровень "DEBUG" для этого нового регистратора, но он все еще делает то или другое. Как настроить его так, чтобы у LogFileAppender был уровень DEBUG, а у RichTextBoxAppender - уровень INFO?
Ответы
Ответ 1
Вы должны иметь возможность добавлять фильтр для обоих ваших приложений.
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="INFO" />
<levelMax value="FATAL" />
</filter>
Таким образом, один appender будет регистрироваться только на определенном уровне, а другой - на другом уровне, даже если они определены одним и тем же журналом.
Ответ 2
Я согласен с @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 в конце. Это сообщает журналу, что если он достигнет этой строки, не регистрируйте его. Таким образом, он будет записывать сообщения DEBUG, сообщения ERROR и ничего больше.
Существует множество способов манипулирования фильтром, чтобы получить именно то, что вы хотите. Вот статья (полное выражение об отказе от ответственности: я ее написал), которая показывает вам, как делать несколько разных действий с фильтром, кроме всего диапазона уровней:
http://www.codeproject.com/KB/dotnet/Log4net_Tutorial.aspx