NLog规则未生效:指定ASP.NET Core组件日志仍写入数据库
问题分析与解决
你的问题出在NLog规则的匹配顺序上——NLog会按配置里的规则从上到下依次匹配,只要规则匹配且final="false",就会继续执行后续规则。
核心问题点
你配置最前面的这条通配符规则:
<logger name="*" minlevel="Info" writeTo="database,console" final="false"/>
它会匹配所有日志(包括Microsoft.AspNetCore.Routing.EndpointMiddleware的Info级日志),而且因为final="false",会继续往下执行后续规则。但这条规则已经先把日志写入数据库了,后面针对该组件的规则再怎么设置,也没法撤销已经完成的写入操作。
修正方案
把针对Microsoft.AspNetCore.Routing.EndpointMiddleware的规则移到通配符*规则的前面,明确设置只写控制台、不写入数据库,同时加上final="true"阻止后续规则执行。
修正后的关键规则顺序示例:
<rules> <logger name="cfm" minlevel="Info" writeTo="cfmdatabase,console" final="true"/> <logger name="db" minlevel="Info" writeTo="database,console" final="true"/> <!-- 先处理目标组件,拦截Info级日志只写控制台,阻止后续规则 --> <logger name="Microsoft.AspNetCore.Routing.EndpointMiddleware" minlevel="Info" writeTo="console" final="true"/> <!-- 再放通配符规则,此时目标组件的日志已经被拦截,不会触发这条规则的数据库写入 --> <logger name="*" minlevel="Info" writeTo="database,console" final="false"/> <!-- 其他规则按需保留,可清理重复的目标组件规则 --> <logger name="Microsoft.AspNetCore.SignalR" minlevel="Warn" writeTo="database,console" final="false"/> <logger name="Microsoft.AspNetCore.Routing.*" minlevel="Warn" writeTo="database,console" final="false"/> <logger name="Microsoft.AspNetCore.SignalR" minlevel="Info" writeTo="console" final="false"/> <logger name="Microsoft.AspNetCore.Routing.*" minlevel="Info" writeTo="console" final="false"/> <logger name="System.*" finalMinLevel="Warn" maxlevel="Info" final="true" /> <!--Skip non-critical Microsoft logs and so log only own logs (BlackHole) --> <logger name="Microsoft.*" finalMinLevel="Warn" maxlevel="Info" final="true" /> <logger name="Microsoft.Hosting.Lifetime" finalMinLevel="Info" minlevel="Info" final="true" /> </rules>
另外,你原来配置里重复的Microsoft.AspNetCore.Routing.EndpointMiddleware规则可以直接删掉,避免冗余。
内容的提问来源于stack exchange,提问作者Eric Robishaw
相关产品推荐
相关产品推荐

