Можно ли использовать подстановочные знаки для имен регистраторов в конфигурации log4net?

В моем приложении я использую log4net, при этом все типы создают свой собственный регистратор на основе своего типа, например. :

private static readonly ILog Log = LogManager.GetLogger(typeof(Program));

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

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

Можно ли использовать какие-то подстановочные знаки в конфигурации регистратора, чтобы все их регистраторы регистрировались только в WARN, например. :

 <logger name="com.thirdparty.*">
    <level value="WARN"/>
  </logger>

[Точный пример выше, использование * не работает]


person Rob Levine    schedule 07.01.2010    source источник


Ответы (2)


Вы можете просто указать часть пространства имен, чтобы оно применялось ко всем сообщениям в этом пространстве имен (включая вложенные).

Вот пример, который я часто использую:

  <root>
    <level value="FATAL" />
    <appender-ref ref="RollingFile" />
  </root>

  <logger name="MyCompany.Web" >
    <level value="WARN" />
    <appender-ref ref="WebErrors" />
  </logger>

  <!-- Will log all FATALs from NHibernate, including NHibernate.SQL and all the nested -->
  <logger name="NHibernate" >
    <level value="FATAL" />
  </logger>

Дополнительно рекомендую прочитать инструкцию. Это дает много объяснений. Например, вы можете прочитать об иерархии регистратора. Вот цитата оттуда:

Регистратор считается предком другого регистратора, если его имя, за которым следует точка, является префиксом имени регистратора-потомка. Регистратор считается родителем дочернего регистратора, если между ним и дочерним регистратором нет предков. Иерархия работает почти так же, как пространство имен и иерархия классов в .NET.

а также:

Наследование уровней. Унаследованный уровень для данного регистратора X равен первому ненулевому уровню в иерархии регистраторов, начиная с X и продвигаясь вверх по иерархии к корневому регистратору.

person Dmytrii Nagirniak    schedule 07.01.2010
comment
@Dmitriy, ты прав. Я никогда этого не знал! Я почти чувствую себя глупо, спрашивая сейчас :). Спасибо за ответ. - person Rob Levine; 08.01.2010
comment
Кстати, все это хорошо задокументировано на сайте log4net. Добавил ссылку в ответ. - person Dmytrii Nagirniak; 08.01.2010
comment
Спасибо за ссылку Дмитрий. Я не могу не задаться вопросом, где было бы переполнение стека, если бы все просто прочитали руководство. - person Brian Hasden; 08.01.2010

Разве вы не можете сделать противоположное тому, что вы просите. Я имею в виду, что просто установите уровень журнала по умолчанию на предупреждение, а затем установите определенные регистраторы на DEBUG.

Кроме того, вы можете установить пороговое значение вашего приложения на DEBUG, а другое приложение установить WARN.

Например:

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

<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender,log4net">
    <to value="[email protected]" />
    <from value="[email protected]" />
    <subject value="Notification" />
    <smtpHost value="server01" />
    <bufferSize value="1" />
    <lossy value="false" />
    <layout type="log4net.Layout.PatternLayout,log4net">
        <conversionPattern value="%property{log4net:HostName} :: %level :: %message %newlineLogger: %logger%newlineThread: %thread%newlineDate: %date%newlineNDC: %property{NDC}%newline%newline" />
    </layout>
    <threshold value="DEBUG" />
</appender>
person Brian Hasden    schedule 07.01.2010
comment
@ Брайан - Спасибо за ответ. Да, я мог бы, но проблема в том, что у меня много типов. Использование белого списка для ведения журнала сделало бы мою конфигурацию ведения журнала огромной и громоздкой, поэтому я задавался вопросом о подходе с черным списком. - person Rob Levine; 08.01.2010
comment
Понял. Я просто дал возможный подход в зависимости от того, сколько других регистраторов вы определили. Я обновил свой ответ, чтобы предложить определить порог на уровне приложения. Затем просто измените стороннюю библиотеку, чтобы использовать приложение с соответствующим порогом, в то время как ваше приложение все еще установлено на DEBUG. - person Brian Hasden; 08.01.2010
comment
@Brian - в любом случае спасибо за предложение - это хороший подход, если у вас всего несколько регистраторов. Что касается вашей второй части предложения - в моем случае я хочу, чтобы оба шли к одной и той же цели (один файл журнала или окно консоли). Будет ли этот подход работать там? - person Rob Levine; 08.01.2010
comment
Нет, если вы измените пороговое значение для приложения, оно будет применяться к каждому регистратору, записывающемуся в него. Это означает, что если вы собираетесь указать всем регистраторам один и тот же аппендер, то все они будут иметь одинаковый порог. В вашей ситуации это не сработает. - person Brian Hasden; 08.01.2010