.NET 6.0为什么跟踪侦听器配置不再工作?



我刚刚在。net 6.0的VS2022中创建了一个新的简单的控制台应用程序-所有默认设置。

然后我添加到项目:

包System.Configuration.ConfigurationManager
  • 应用程序。配置文件

在app.config中,我放入以下代码(仅来自microsoft的标准示例):

<?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...");

然后我运行app和…根本没有创建跟踪日志!

所以,没有错误,它开始和结束,但没有跟踪输出。此外,在跟踪侦听器列表中,我只看到1个元素- "System.Diagnostics.DefaultTraceListener"

看起来。net 6.0应用程序完全忽略了节。但是为什么呢? !

如何使它像。net 2中那样工作。x . .4.x框架? !

正如上面的注释所述,. net 6.0在初始化Trace系统时没有考虑app.config文件。

因此,除非您手动读取app.config文件(使用或不使用System.Configuration.ConfigurationManager.GetSection()等)并从中配置Trace,否则在。net 6.0中不可能发生这种情况。

在GitHub上的评论中给出的原因是,System.Configuration.ConfigurationManager包在。net Core中不存在。Trace*的东西最初是移植到。net Core的。

从。net 7.0开始,该功能是可用的。但是,您需要手动确保初始化是基于app.config文件进行的。这是必要的,因为没有。net (Core)会自动(由运行时)初始化ConfigurationManager。
<?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>

app.config与你的版本基本没有变化。

确保至少在7.0.0版本中添加了对System.Configuration.ConfigurationManager.nupkg的引用。x版本不包括TraceConfiguration类)

// See https://aka.ms/new-console-template for more information
using System.Diagnostics;
Console.WriteLine("Hello, World!");
// Initialize Trace configuration from app.config
TraceConfiguration.Register();
// ...

注意,您不会看到在执行TraceConfiguration.Register()行之前运行的代码发出的任何跟踪消息。如果Trace是从静态初始化运行的代码中使用,就可能出现这种情况。

相关内容

  • 没有找到相关文章

最新更新