.NET 6.0 Trace Listeners配置失效,如何恢复传统框架运行效果?
问题:.NET 6控制台应用忽略app.config中<system.diagnostics>配置,无法生成Trace日志
我在VS2022中创建了默认设置的.NET 6.0控制台应用,添加了System.Configuration.ConfigurationManager包和app.config文件。
app.config内容如下:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.diagnostics> <trace autoflush="false" indentsize="4"> <listeners> <clear/> <add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="TextWriterOutput.log" /> <remove name="Default" /> </listeners> </trace> </system.diagnostics> </configuration>
Program.cs代码:
// See https://aka.ms/new-console-template for more information using System.Diagnostics; Console.WriteLine("Hello, World!"); var x = new System.Diagnostics.TextWriterTraceListener(); Trace.WriteLine("abs-test"); Console.WriteLine(string.Format("--- {0} trace listeners", Trace.Listeners.Count)); int idx = 0; foreach (TraceListener lsnr in Trace.Listeners) { idx++; Console.WriteLine(string.Format(" #{0}: {1}", idx, lsnr)); } Console.WriteLine("ok...");
运行后程序正常启动结束,但未生成TRACE日志,Trace.Listeners中仅存在System.Diagnostics.DefaultTraceListener,app.config的<system.diagnostics>配置完全被忽略。如何让它像.NET 2.x至4.x那样正常工作?
原因
.NET 6属于.NET Core衍生版本,与传统.NET Framework的配置加载机制存在差异:
- .NET Framework会自动解析app.config中的<system.diagnostics>节点,自动初始化Trace监听集合;
- .NET Core/.NET 5+默认不会自动加载该节点配置,需要手动完成配置读取和监听集合的初始化。
解决方法
1. 调整配置文件名称
将项目中的app.config重命名为{你的项目名称}.dll.config(例如项目名为TraceTestApp,则改为TraceTestApp.dll.config)。编译后该文件会自动输出到程序运行目录,确保程序能读取到配置。
2. 手动加载并应用Diagnostics配置
在Program.cs开头添加配置加载代码,读取<system.diagnostics>节点并初始化Trace监听:
修改后的Program.cs代码:
using System.Diagnostics; using System.Configuration; // 加载diagnostics配置 var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); var diagnosticsSection = (SystemDiagnosticsSection)config.GetSection("system.diagnostics"); diagnosticsSection.TraceSettings.Configure(Trace.Listeners); // 同步配置中的autoflush设置 Trace.AutoFlush = diagnosticsSection.TraceSettings.AutoFlush; Console.WriteLine("Hello, World!"); // 配置已自动添加监听,无需手动创建 Trace.WriteLine("abs-test"); Console.WriteLine($"--- {Trace.Listeners.Count} trace listeners"); int idx = 0; foreach (TraceListener lsnr in Trace.Listeners) { idx++; Console.WriteLine($" #{idx}: {lsnr}"); } // 确保日志写入文件 Trace.Flush(); Console.WriteLine("ok...");
额外说明
- 原代码中手动创建的
TextWriterTraceListener未添加到Trace.Listeners,这部分可移除,配置加载后会自动添加指定监听; - 配置中的
autoflush属性需要手动同步到Trace.AutoFlush,配置加载不会自动设置该属性; - 运行后检查程序目录,会生成
TextWriterOutput.log文件,其中包含abs-test日志内容。
内容的提问来源于stack exchange,提问作者dmitry_bond
相关产品推荐
相关产品推荐

