我刚刚在VS 2022中为.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...");
然后我运行应用程序和...跟踪日志根本没有创建!
所以,没有错误,它开始和结束,但没有跟踪输出。此外-在跟踪侦听器列表中,我只看到1个元素-“System.Diagnostics.DefaultTraceListener”。
看起来.NET 6.0应用程序完全忽略<system.diagnostics>了app.config中的任何配置!但是为什么呢?!
如何让它像在.NET 2.x.. 4.x框架中一样工作?
1条答案
按热度按时间holgip5t1#
正如上面的注解中所概述的,. NET6.0在初始化Trace系统时没有考虑app.config文件。
因此,除非您手动读取app.config文件(使用或不使用System.Configuration.ConfigurationManager.GetSection()等)并从中配置Trace,否则在. NET6.0中不可能发生这种情况。
GitHub上的评论中给出的原因是,在System.Diagnostics.Trace* 最初移植到. NET Core时,System.Configuration.ConfigurationManager包在. NET Core中不存在。
该功能从.NET 7.0开始可用。但是,您需要手动确保基于app.config文件进行初始化。这是必要的,因为.NET(Core)不会导致ConfigurationManager自动初始化(由运行时)。
app.config与您的版本基本上没有变化。
确保至少在版本 7.0.0 中添加了对System.Configuration.ConfigurationManager.nupkg的引用(6.x版本不包括
TraceConfiguration
类)。请注意,您不会看到在执行
TraceConfiguration.Register()
行之前运行的代码发出的任何跟踪消息。如果从静态初始化运行的代码使用Trace,则可能会出现这种情况。