Можно ли подстановить имена регистраторов в конфигурации log4net? - PullRequest
23 голосов
/ 08 января 2010

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

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

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

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

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

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

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

Ответы [ 2 ]

34 голосов
/ 08 января 2010

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

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

  <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>

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

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

, а также:

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

4 голосов
/ 08 января 2010

Не можете ли вы сделать противоположное тому, что вы спрашиваете. Я имею в виду просто установить уровень журнала по умолчанию warn , а затем установить определенные логгеры, которые вы определили, как 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="asdf@example.com" />
    <from value="group@example.com" />
    <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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...