Log4net: настроить игнорирование сообщений определенного класса
Есть ли способ, чтобы конфигурация log4net игнорировала определенный класс? Например, мы обычно создаем журнал в каждом классе. Аналогично этому:
private static readonly ILog Log = log4net.LogManager.GetLogger("MyClass");
Проблема MyClass
регистрирует экстремальный объем данных, и сложно найти информацию о других классах. Его другой разработчик, который использует MyClass
, поэтому я не могу просто войти и изменить файлы журналов, но в своей среде я хотел бы проигнорировать их.
Могу ли я установить файл configuration
для игнорирования сообщений из определенного класса?
Ответы
Ответ 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
.
Ответ 4
Возможно, вы захотите применить категорию к своим собственным сообщениям
Попробуйте эту тему:
Как добавить префикс категории в сообщение log4net?