.NET 6 Minimal API中如何通过appsettings.json过滤Microsoft日志?
解决NLog过滤Microsoft命名空间日志不写入数据库的问题
问题分析
你之前的规则未生效,核心原因是NLog规则的执行顺序是从上到下的,如果过滤Microsoft日志的规则放在写入数据库的规则之后,日志会先被写入数据库,再执行过滤规则,自然起不到效果。另外,仅用finalMinLevel不足以终止后续规则的处理,需要配合final: true属性。
正确配置方案
调整NLog规则顺序,将Microsoft命名空间的过滤规则放在最顶部,同时通过final: true终止后续规则对该类日志的处理。根据你的需求,提供两种配置方式:
方式1:完全排除所有Microsoft命名空间的日志(无论级别)
{ "NLog": { "targets": { "database": { "type": "Database", // 此处保留你已有的数据库目标配置(连接字符串、命令文本等) } }, "rules": [ // 先处理Microsoft日志,完全排除并终止后续规则 { "logger": "Microsoft.*", "minLevel": "Off", "final": true }, // 所有其他日志写入数据库 { "logger": "*", "minLevel": "Information", "writeTo": "database" } ] } }
方式2:仅保留Microsoft命名空间的Error及以上日志,其余排除
如果你需要保留Microsoft的错误日志,只需要修改过滤规则的minLevel:
{ "logger": "Microsoft.*", "minLevel": "Error", "final": true }
关键说明
- 规则顺序优先级:NLog会按
rules数组的顺序执行规则,所以过滤规则必须放在写入数据库的规则之前,才能拦截住目标日志。 - final属性的作用:
final: true表示匹配到该规则的日志不再执行后续的任何规则,确保Microsoft日志不会被后续的写入规则处理。 - finalMinLevel的替代:你之前使用的
finalMinLevel其实是minLevel+final: true的简写,但同样需要注意规则顺序才能生效,推荐显式配置minLevel和final更清晰。
验证配置
修改配置后,重启服务,测试生成一些日志,检查数据库中是否不再出现Microsoft命名空间的非Error日志(或全部Microsoft日志,根据你选择的方式)。
内容的提问来源于stack exchange,提问作者Bradley Plett
相关产品推荐
相关产品推荐

