Log4net中GlobalContext属性作为PropertyFilter过滤不生效如何正确配置?
问题根因
- 配置执行顺序错误:
GlobalContext属性必须在调用XmlConfigurator.Configure()之前完成赋值,log4net初始化配置时会绑定上下文属性的读取逻辑,配置完成后再赋值的全局属性不会被已初始化的过滤器识别,也就是你看到的LoggingEvent.Properties为空的原因。 - PropertyFilter缺少匹配规则配置:默认情况下PropertyFilter匹配成功后不会直接放行日志,需要显式配置
acceptOnMatch参数,否则匹配后会继续走后续过滤规则,最终可能被默认规则丢弃。
修复步骤
1. 调整Program.cs代码执行顺序
把GlobalContext赋值的代码移到Configure调用之前,修正后的代码如下:
class Program { private static ILog log; static void Main(string[] args) { string appName = "MyApp"; // 先设置全局上下文属性,再初始化log4net配置 log4net.GlobalContext.Properties["ApplicationName"] = appName; log4net.Config.XmlConfigurator.Configure(); log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); log.Info("Info Log!" + appName); log.Error("Error Log!" + appName); log.Warn("Warn Log!" + appName); log.Debug("Debug Log!" + appName); log.Fatal("Fatal Log test!" + appName); Console.WriteLine("Hit enter"); Console.ReadLine(); } }
2. 修改app.config中的PropertyFilter配置
补充acceptOnMatch参数,末尾新增DenyAllFilter明确过滤逻辑,避免不匹配的日志被误记录:
<appender name="file" type="log4net.Appender.RollingFileAppender"> <file value="app.log" /> <filter type="log4net.Filter.PropertyFilter"> <Key value="ApplicationName" /> <StringToMatch value="MyApp" /> <!-- 匹配到对应属性时直接接受日志 --> <acceptOnMatch value="true" /> </filter> <!-- 拒绝所有未匹配上的日志 --> <filter type="log4net.Filter.DenyAllFilter" /> <appendToFile value="true" /> <rollingStyle value="Size" /> <maxSizeRollBackups value="5" /> <maximumFileSize value="10MB" /> <staticLogFileName value="true" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="Date:%date Thread:[%thread] Level:%-5level Logger:%logger - ApplicationName:%P{ApplicationName}; Message:%message%newline" /> </layout> </appender>
补充说明
如果确实有需要在配置初始化后修改全局属性的场景,可以在修改属性后再次调用XmlConfigurator.Configure()重新加载配置,即可让新的属性值被过滤器识别。
内容的提问来源于stack exchange,提问作者Jairo Franchi
相关产品推荐
相关产品推荐

