.NET Core 3.1控制台应用无视日志级别打印所有Trace日志问题
问题产生原因
- 核心逻辑错误:
TraceSwitch暴露的TraceError/TraceWarning/TraceInfo/TraceVerbose成员是布尔类型的判断属性,作用是返回当前开关配置下对应级别的日志是否允许输出,并非待打印的日志内容。你将这几个布尔值直接作为Trace.WriteLine的消息参数传入,自然会在每条日志末尾打印True/False,且WriteLine方法默认无条件执行,因此所有级别日志都会被输出。 - 未使用条件输出方法:
Trace类不会自动关联你实例化的TraceSwitch做过滤,直接调用Trace.WriteLine会无视开关配置输出所有传入内容,必须通过条件判断或专用的条件输出方法,才能实现按级别过滤。 - 配置文件复制问题(潜在坑点):如果没有将
appsettings.json设置为复制到输出目录,运行时会找不到配置文件,TraceSwitch会使用默认值Off,所有日志都不会输出。你当前的运行结果说明配置绑定已生效,该问题不是本次异常的诱因,但调整时需要确认。
修复方法
- 替换原有的四行
Trace.WriteLine调用,改用Trace.WriteLineIf条件输出方法:将对应级别的布尔判断属性作为第一个条件参数,真正的日志文本作为第二个消息参数。修正后的输出代码如下:
Trace.WriteLineIf(ts.TraceError, "Trace error"); Trace.WriteLineIf(ts.TraceWarning, "Trace warning"); Trace.WriteLineIf(ts.TraceInfo, "Trace info"); Trace.WriteLineIf(ts.TraceVerbose, "Trace verbose");
- 右键点击项目中的
appsettings.json文件,在属性窗口将「复制到输出目录」设置为如果较新则复制,避免运行时丢失配置。
修复后重新执行dotnet run --configuration Release,当日志级别设置为Warning时,仅会输出Error和Warning级别的日志,无多余布尔后缀,和书中预期结果完全一致。
补充说明:
TraceLevel枚举的级别从宽松到严格排序为:Verbose > Info > Warning > Error > Off,设置为某一级别时,会自动开放所有优先级高于等于该级别的日志输出权限。
内容的提问来源于stack exchange,提问作者teefour
相关产品推荐
相关产品推荐

