【问题标题】:log4net filter by threadcontext property (.NET Core)log4net 按线程上下文属性过滤(.NET Core)
【发布时间】:2019-04-24 09:08:42
【问题描述】:

我正在尝试创建多个附加程序,每个附加程序仅记录某些消息。应根据设置为 ThreadContext 的选定属性执行过滤。我所做的如下(log4net.config)

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
  </configSections>
  <log4net>

    <appender name="FileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="MyLog_"/>
      <appendToFile value="true"/>
      <rollingStyle value="Composite"/>
      <datePattern value="yyyy-MM-dd.\l\o\g"/>
      <maximumFileSize value="100MB"/>
      <staticLogFileName value="false"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date{HH:mm:ss.fff} [%4thread] [%property{Category}] %-5level %logger - %message%newline"/>
      </layout>
      <filter type="log4net.Filter.PropertyFilter">
        <Key value="Category" />
        <StringToMatch value="3" />
        <acceptOnMatch value="true" />
      </filter>
    </appender>

    <appender name="SecurityFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="MyLog_Security_"/>
      <appendToFile value="true"/>
      <rollingStyle value="Composite"/>
      <datePattern value="yyyy-MM-dd.\l\o\g"/>
      <maximumFileSize value="100MB"/>
      <staticLogFileName value="false"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date{HH:mm:ss.fff} [%4thread] [%property{Category}] %-5level %logger - %message%newline"/>
      </layout>
      <filter type="log4net.Filter.PropertyFilter">
        <key value="Category" />
        <stringToMatch value="1" />
        <acceptOnMatch value="true" />
      </filter>
    </appender>

    <root>
      <level value="ALL" />
      <appender-ref ref="FileAppender" />
      <appender-ref ref="SecurityFileAppender" />
    </root>

  </log4net>
</configuration>

为了在记录消息之前设置属性值,我发出以下代码行:

    log4net.ThreadContext.Properties["Category"] = "3";
    _log.Info("Normal info");
    log4net.ThreadContext.Properties["Category"] = "1";
    _log.Info("Security info");

我尝试使用和不使用“acceptOnMatch”来配置 log4net。 在每种情况下,线程上下文的过滤器似乎都不起作用。两条消息都出现在两个文件中。

我应该如何修复配置以使按线程上下文属性进行过滤工作?真的可行吗?

谢谢,拉德克

【问题讨论】:

    标签: c# log4net log4net-configuration log4net-appender log4net-filter


    【解决方案1】:

    为了解决这个问题,我需要在已经定义如下的每个过滤器下添加第二个过滤器配置:

    <filter type="log4net.Filter.DenyAllFilter" />
    

    这使得上面的过滤器工作。奇怪,但这就是它的工作原理。

    示例固定附加程序如下所示:

    <appender name="SecurityFileAppender" type="log4net.Appender.RollingFileAppender">
       ...
          <file value="MyLog_Security_"/>
          <filter type="log4net.Filter.PropertyFilter">
            <key value="Category" />
            <stringToMatch value="1" />
            <acceptOnMatch value="true" />
          </filter>
          <filter type="log4net.Filter.DenyAllFilter" />
        </appender>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多