Подтвердить что ты не робот

Log4net: настроить игнорирование сообщений определенного класса

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

<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 является пространством имен, указанная конфигурация отключает ведение журнала во всем пространстве имен. Второй "пример" отключает ведение журнала для вашего класса (согласно вашему вопросу).

Ответ 3

Я бы предложил использовать Фильтры. Однако, поскольку я пытался найти всю картину, когда я пытался реализовать фильтр, я отправляю образец фрагмента созданного 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.