log4net: настроить игнорирование сообщений от определенного класса - PullRequest
62 голосов
/ 31 марта 2011

Есть ли способ заставить конфигурацию log4net игнорировать определенный класс? Например, мы обычно создаем журнал в каждом классе. Похоже на это:

private static readonly ILog Log = log4net.LogManager.GetLogger("MyClass");

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

Можно ли настроить файл configuration на игнорирование сообщений определенного класса?

Ответы [ 4 ]

72 голосов
/ 31 марта 2011

Конечно, используйте фильтр .

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

<filter type="log4net.Filter.LoggerMatchFilter">
  <!-- allows this sub-namespace to be logged... -->
  <loggerToMatch value="Noisy.Namespace.But.Important" />
</filter>
<filter type="log4net.Filter.LoggerMatchFilter">
  <!-- ...but not the rest of it -->
  <loggerToMatch value="Noisy.Namespace" />
  <acceptOnMatch value="false" />
</filter>
54 голосов
/ 01 апреля 2011

Фильтр, безусловно, работает, но я бы предпочел отключить регистратор (или иерархию регистраторов), например, так:

<logger name="YourNameSpace.WithNoLogging" additivity="false">
    <level value="OFF" />        
</logger>
<logger name="MyClass" additivity="false">
    <level value="OFF" />        
</logger>
<root>
    <level value="ALL" />
    <appender-ref ref="YourAppender" />
</root>

Если предположить, что YourNameSpace.WithNoLogging является пространством имен, то показанная конфигурация отключит ведение журнала во всем пространстве имен. Второй «пример» отключает ведение журнала для вашего класса (в зависимости от вашего вопроса).

14 голосов
/ 06 июня 2014

Я бы предложил также использовать Фильтры . Однако, так как я изо всех сил пытался найти полную картину, когда пытался реализовать фильтр, я публикую пример фрагмента созданного мной Configutation file, который указывает, куда идут фильтры.

Фильтр, который вы собираетесь использовать, в этом случае будет

log4net.Filter.LoggerMatchFilter ---- (Сопоставляется с началом имя регистратора.)

Подсказка в файле config для Log4Net важно, где вы размещаете свои теги, и их приоритет действительно имеет значение. Таким образом, в этом случае тег <filter> следует после открывающего тега <appender> и до его тега <file value = ... />.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
    </configSections>
    <log4net>
        <appender name="RollingFile.PassedDevices" type="log4net.Appender.RollingFileAppender">
            <filter type="log4net.Filter.LoggerMatchFilter">
                <loggerToMatch value="Foo.namespace.bar.mySubclass" />
                <acceptOnMatch value="false" />
            </filter>
            <file value="myPassedDevices.log" />
            <appendToFile value="true" />
            <maximumFileSize value="100KB" />
            <maxSizeRollBackups value="2" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%timestamp    %level  - %message  [%thread]       %logger%newline" />
            </layout>
        </appender>
        <root>
            <level value="DEBUG" />
            <appender-ref ref="RollingFile" /> <!-- My other appender which logs all and I cut it out in this snippet. Remember that you should reference all your appenders in this tag to make them work.-->
            <appender-ref ref="RollingFile.PassedDevices" />
        </root>
    </log4net>
</configuration>

В этом методе у вас может быть несколько appenders, которые вы можете перенаправить результаты регистрации определенного регистратора в отдельный appender вместо их игнорирования. Например, один appender для всех журналов и один для отфильтрованных журналов для определенного class.

2 голосов
/ 31 марта 2011

Возможно, вы захотите попробовать применить категорию к вашим собственным сообщениям. Попробуйте эту тему: Как добавить префикс категории в сообщение log4net?

...