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

ehxuflar  于 2023-04-07  发布在  .NET
关注(0)|答案(1)|浏览(127)

我刚刚在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框架中一样工作?

holgip5t

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自动初始化(由运行时)。

<?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的引用(6.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,则可能会出现这种情况。

相关问题