Как мне отфильтровать пользовательский уровень в log4net?

Я скопировал образцы log4net, чтобы реализовать настраиваемый уровень журнала, AUDIT. Я определил, что AUDIT имеет значение 35000, между DEBUG 30000 и INFO 40000.

Ниже приведен раздел моей конфигурации. У меня есть одно приложение, которое регистрирует все уровни, и одно, которое должно регистрировать только уровни AUDIT (это только для тестирования)

<log4net>
  <appender name="FileAppender" type="log4net.Appender.FileAppender" >
    <file value="testrun.log" />
    <layout type="log4net.Layout.PatternLayout" >
      <conversionPattern value="%date{HH:mm:ss:fff} [%thread] %-5level %logger{1} - %message%newline" />
    </layout>
  </appender>
  <appender name="FileAppender.Audit" type="log4net.Appender.FileAppender" >
    <filter type="log4net.Filter.LevelMatchFilter">
      <levelToMatch value="AUDIT" />
    </filter>
    <file value="testrun.audit.log" />
    <layout type="log4net.Layout.PatternLayout" >
      <conversionPattern value="%date{HH:mm:ss:fff} [%thread] %-5level %logger{1} - %message%newline" />
    </layout>
  </appender>  
  <root>
    <level value="ALL" />
    <appender-ref ref="FileAppender" />
    <appender-ref ref="FileAppender.Audit" />
  </root>
</log4net>

Методика испытаний

private static readonly IAuditLog log = AuditLogManager.GetLogger(typeof(Program));
public static void Main()
{
    log.Debug("Debug");
    log.Audit("Audit");
    log.Info("Info");
}

Однако вывод приложений такой же ...

13:09:11:540 [9] DEBUG Program - Debug
13:09:11:560 [9] AUDIT Program - Audit
13:09:11:560 [9] INFO  Program - Info

Выходные данные отладки log4net при разборе LevelMatchFilter:

log4net: Loading Appender [FileAppender.Audit] type: [log4net.Appender.FileAppender]
log4net:ERROR XmlHierarchyConfigurator: Unknown Level Specified [AUDIT]
log4net:WARN Unable to set property [levelToMatch] on object [log4net.Filter.LevelMatchFilter] using value [AUDIT] (with acceptable conversion types)
log4net: Setting Collection Property [AddFilter] to object [log4net.Filter.LevelMatchFilter]

person Anthony Mastrean    schedule 11.02.2009    source источник
comment
Обновление: я не могу фильтровать ЛЮБОЙ уровень, даже уровни, уже встроенные в log4net (например, DEBUG).   -  person Anthony Mastrean    schedule 13.02.2009
comment
Этот вопрос помог мне настроить фильтр log4net, но я должен отметить, что ведение журнала и аудит - хотя часто их объединяют - представляют собой две совершенно разные задачи в серьезной системе. Смешивать или уравнивать их не рекомендуется.   -  person DanO    schedule 14.07.2018


Ответы (2)


log4net версии 1.2.10 требует, чтобы вы завершали цепочку LevelMatchFilter с помощью DenyAllFilter, если вы хотите поведение, которое я описал в вопросе.

<appender name="FileAppender.Audit" type="log4net.Appender.FileAppender" >
  <filter type="log4net.Filter.LevelMatchFilter">
    <levelToMatch value="AUDIT" />
  </filter>
  <filter type="log4net.Filter.DenyAllFilter" />
  <file value="testrun.audit.log" />
  <layout type="log4net.Layout.PatternLayout" >
    <conversionPattern value="%date{HH:mm:ss:fff} [%thread] %-5level %logger{1} - %message%newline" />
  </layout>
</appender>
person Anthony Mastrean    schedule 03.03.2009

Вам нужно будет добавить

<level>
  <name value="AUDIT" />
  <value value="35000" />
</level>

в разделе конфигурации log4net.

person olle    schedule 11.02.2009