Log4Net-如何正确使用PropertyFilter

Log4Net-如何正确使用PropertyFilter,log4net,Log4net,好的,这是附录: <appender name="DebugFileAppender" type="log4net.Appender.FileAppender"> <file value="debug.log" /> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <filter type="log4net.Filter.PropertyFilter">

好的,这是附录:

<appender name="DebugFileAppender" type="log4net.Appender.FileAppender">
  <file value="debug.log" />
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
  <filter type="log4net.Filter.PropertyFilter">
    <Key value="ApplicationName" />
    <StringToMatch value="Test Application" />
  </filter>
  <filter type="log4net.Filter.LevelRangeFilter">
    <levelMin value="DEBUG" />
    <levelMax value="DEBUG" />
  </filter>
  <filter type="log4net.Filter.DenyAllFilter" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="Date:%date Thread:[%thread] Level:%-5level Logger:%logger - ApplicationName:%property{ApplicationName}; Message:%message%newline" />
  </layout>
</appender>
在我的测试中,如果我调用:

var logger = new MyLogger();

logger.LogDebug(new LogCodeSource { ApplicationName = "Test Application", ComponentName = "Test component", MethodName = "Test method" }, new LogExecutionSource { ClientMachineName = "Test client", ServerMachineName = "Test server", UserName = "Test user" }, "Test message");
logger.LogDebug(new LogCodeSource { ApplicationName = "DoNotLog", ComponentName = "Test component", MethodName = "Test method" }, new LogExecutionSource { ClientMachineName = "Test client", ServerMachineName = "Test server", UserName = "Test user" }, "Test message");
在root中,我尝试过:

<root>
  <appender-ref ref="DebugFileAppender" />
</root>

您需要的是AND筛选器,因为您希望记录所有消息,其中
ApplicationName
与特定名称匹配,级别为
DEBUG
。不幸的是,log4net没有提供现成的功能和过滤器,但是详细介绍了如何实现一个功能。

如果直接使用log4net,则在使用Microsoft.Extensions.Logging.Abstraction时也可以使用属性过滤器

例如:

using (_logger.BeginScope(new[] { new KeyValuePair<string, object>("YourPropertyKey", "YourPropertyValue") }))
{
    _logger.LogDebug("My special log with context property set");
}
使用(_logger.BeginScope(new[]{new KeyValuePair(“YourPropertyKey”,“YourPropertyValue”)}))
{
_LogDebug(“设置了上下文属性的我的特殊日志”);
}
然后在配置中,必须为属性和键设置appender。 请注意,如果要允许一个键具有多个值,则在与StringToMath的顺序中存在匹配

<log4net>
  <root>
    <level value="ALL" />
    <appender-ref ref="property_logger" />
  </root>
  <appender name="property_logger" type="log4net.Appender.RollingFileAppender">
    <file value="logs/my_service.log" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <datePattern value="-yyyyMMdd" />
    <maxSizeRollBackups value="5" />
    <maximumFileSize value="5MB" />
    <preserveLogFileNameExtension value="true" />
    <staticLogFileName value="false" />
    <filter type="log4net.Filter.PropertyFilter">
      <Key value="YourPropertyKey" />
      <StringToMatch value="YourPropertyValue" />
    </filter>
    <filter type="log4net.Filter.DenyAllFilter" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%2thread] %-5level %.50logger - %message%newline" />
    </layout>
  </appender>
</log4net>

您是否尝试过仅使用该定义?我有一种感觉,如果你有多个过滤器像那样堆叠起来,如果其中任何一个通过,它将被记录。但我已经有一段时间没看了,所以记不起确切的细节了。可能更多的是从一个到另一个…嗯。。。成功了。那么,Log4Net是否没有一种方法来防止通过所有过滤器的级联呢?或者我需要为每个级别指定吗?再考虑一下,我认为每个过滤器可以返回3个东西。将记录沿“Log”->行的内容。“拒绝”->将不会被记录,将停止处理。“Meh”->将继续使用下一个过滤器。看起来您的属性筛选器正在返回“Meh”。是否有其他选项可以传递给它,将其更改为“拒绝”,我不确定,我必须开始在文档中挖掘。
Date:2015-12-31 11:11:00,928 Thread:[14] Level:DEBUG Logger:MyLogger - ApplicationName:Test Application; Message:Test message
Date:2015-12-31 11:11:00,942 Thread:[14] Level:DEBUG Logger:MyLogger - ApplicationName:DoNotLog; Message:Test message
using (_logger.BeginScope(new[] { new KeyValuePair<string, object>("YourPropertyKey", "YourPropertyValue") }))
{
    _logger.LogDebug("My special log with context property set");
}
<log4net>
  <root>
    <level value="ALL" />
    <appender-ref ref="property_logger" />
  </root>
  <appender name="property_logger" type="log4net.Appender.RollingFileAppender">
    <file value="logs/my_service.log" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <datePattern value="-yyyyMMdd" />
    <maxSizeRollBackups value="5" />
    <maximumFileSize value="5MB" />
    <preserveLogFileNameExtension value="true" />
    <staticLogFileName value="false" />
    <filter type="log4net.Filter.PropertyFilter">
      <Key value="YourPropertyKey" />
      <StringToMatch value="YourPropertyValue" />
    </filter>
    <filter type="log4net.Filter.DenyAllFilter" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%2thread] %-5level %.50logger - %message%newline" />
    </layout>
  </appender>
</log4net>