如何通过log4net实现并行Task各自输出独立日志、非Task日志归入主日志
问题修复方案
你需要做3处修改即可实现预期效果:
- 修复log4net配置里的appender引用错误
你在root节点中引用的appender名称和实际配置的Task专属appender名称不一致,将root节点内的
<appender-ref ref="LogicRollingLogFileAppender" />
修改为
<appender-ref ref="TaskRollingLogFileAppender" />
- 给全局上下文设置默认LogicName值
在程序启动入口(比如控制台的Main方法、Web应用的Startup初始化逻辑最顶部)添加一行代码,给没有单独设置逻辑名的上下文默认赋值为Main,避免属性为null的情况:
log4net.LogicalThreadContext.Properties["LogicName"] = "Main";
- 优化过滤器逻辑(可选,稳定性更强)
你当前用的反向正则匹配容易出现边缘场景的匹配错误,可以把两个appender的过滤器改成更直观的正向匹配逻辑:
MainRollingLogFileAppender的过滤器替换为:
<filter type="log4net.Filter.PropertyFilter"> <key value="LogicName" /> <StringToMatch value="Main" /> <acceptOnMatch value="true" /> </filter> <filter type="log4net.Filter.DenyAllFilter" />
TaskRollingLogFileAppender的过滤器替换为:
<filter type="log4net.Filter.PropertyFilter"> <key value="LogicName" /> <StringToMatch value="Main" /> <acceptOnMatch value="false" /> </filter> <filter type="log4net.Filter.DenyAllFilter" />
修改完成后,所有主线程/未设置逻辑名的上下文日志都会写入Main.log,每个Task设置的logicName对应的日志会写入独立的{logicName}.log文件。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

