如何在 log4net 中过滤自定义级别?

Posted

技术标签:

【中文标题】如何在 log4net 中过滤自定义级别?【英文标题】:How do I Filter on a custom Level in log4net? 【发布时间】:2010-10-06 23:44:52 【问题描述】:

我复制了 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="%dateHH:mm:ss:fff [%thread] %-5level %logger1 - %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="%dateHH:mm:ss:fff [%thread] %-5level %logger1 - %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");

但是,appenders 的输出是一样的...

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

解析LevelMatchFilter时的log4net调试输出为

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]

【问题讨论】:

更新:我无法过滤任何级别,即使是已经内置在 log4net 中的级别(如 DEBUG)。 这个问题帮助我配置了一个 log4net 过滤器,但我必须指出,日志记录和审计——虽然经常被混为一谈——在一个严肃的系统中是两个截然不同的问题。不建议将两者混合或等同。 【参考方案1】:

如果您想要我在问题中描述的行为,log4net 版本 1.2.10 要求您以 DenyAllFilter 结束 LevelMatchFilter 链。

<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="%dateHH:mm:ss:fff [%thread] %-5level %logger1 - %message%newline" />
  </layout>
</appender>

【讨论】:

【参考方案2】:

你需要添加

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

在您的 log4net 配置部分中。

【讨论】:

以上是关于如何在 log4net 中过滤自定义级别?的主要内容,如果未能解决你的问题,请参考以下文章

使用log4net写自定义日志

在网关级别的 dofilter 中为请求添加自定义标头

在C#中的AdjustFileBeforeAppend方法中获取log4net config的自定义xml节点值

Logback自定义过滤器

如何在 vuetify 的数据表中使用“自定义过滤器”道具?或如何创建自定义过滤器以按标题过滤?

如何在 PowerShell 中返回自定义错误级别?