如何找到我在 app.config 中声明的跟踪侦听器(在代码中)

本文关键字:侦听器 跟踪 代码 声明 何找 app config | 更新日期: 2023-09-27 18:33:17

我有自定义跟踪侦听器,它记录到一个字符串(我将绑定到一个 wpf 文本框),我试图在我的 ViewModelLocator 中找到它(或我定义的所有其他侦听器)似乎不在 System.Diagnostics.Trace.Listeners 中)

应用配置代码段

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.diagnostics>
    <switches>
      <add name="RomanExampleWPFAppSwitch" value="Verbose" />
    </switches>
    <sources>
      <source name="RomanExampleWPFApp" switchName="RomanExampleWPFAppSwitch">
        <listeners>
          <remove name="Default" />
          <add name="RollingLog" type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" initializeData="RollingLogWriter" append="true" autoFlush="true" baseFileName="RomanExampleWPFAppLog" location="LocalUserApplicationDirectory" logFileCreationSchedule="Daily" reserveDiskSpace="1073741824" traceOutputOptions="DateTime,LogicalOperationStack" />
          <add name="StringLog" type="RomanExampleWPFApp.Other.StringLogTraceListener, RomanExampleWPFApp" />
          <add name="consoleListener" type="System.Diagnostics.ConsoleTraceListener" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>
</configuration>

如何找到我在 app.config 中声明的跟踪侦听器(在代码中)

如果在 Trace.Listeners 集合中找不到它,则可以假定侦听器从未添加过。 两个基本原因:

  • 您可能正在使用启用 Visual Studio Hosting Process 选项进行调试。 它使用不同的配置文件app.vshost.exe.config。 "项目 + 属性","调试"选项卡将其关闭。

  • .config 文件中的条目可能格式不正确。 你可以从Visual Studio Output窗口中看出,你将看到"第一次机会异常"通知。 "调试 + 异常"中,单击"引发"复选框以强制调试器在引发异常时停止。 您可以从堆栈跟踪中收集信息。 否则,此异常不会阻止应用运行。 我们无法猜测"类型"值是否准确。

您正在定义特定的跟踪源。如果你想在这种情况下跟踪某些东西,你会这样做:

TraceSource source = new TraceSource("RomanExampleWPFApp");
source.TraceInformation("hellow world");

如果你想得到一个听众列表,那么你可以这样做:

TraceSource source = new TraceSource("RomanExampleWPFApp");
foreach (var listener in source.Listeners)
{
   ...
}

它们永远不会被实例化,所以不要指望在任何 TraceSource 集合中找到它们。如果您不介意对诊断配置进行一些反思,则可以插入以下内容的代码输出:

class Program {
    static void Dump( ConfigurationElementCollection collection ) {
        foreach ( ConfigurationElement elm in collection ) {
            Console.WriteLine();
            Console.WriteLine(elm.ToString());
            Console.WriteLine();
            foreach ( PropertyInformation prop in elm.ElementInformation.Properties ) {
                Console.Write( prop.Name + ": " );
                if ( prop.Value == null ) {
                    Console.WriteLine( "null" );
                } else {
                    ConfigurationElementCollection children = prop.Value as ConfigurationElementCollection;
                    if ( children != null ) {
                        Console.WriteLine( "children<" );
                        Console.WriteLine();
                        Dump( children );
                        Console.WriteLine( ">children" );
                        Console.WriteLine( );
                    } else {
                        Console.WriteLine( prop.Value );
                    }
                }
            }
        }
    }
    static void Main( string[] args ) {
        Type tp = typeof( Debug ).Assembly.GetType( "System.Diagnostics.DiagnosticsConfiguration" );
        PropertyInfo propSources = tp.GetProperty( "Sources", BindingFlags.NonPublic | BindingFlags.Static );
        ConfigurationElementCollection sources = (ConfigurationElementCollection)propSources.GetValue( null, null );
        Dump( sources );
        //for ( int i = 0; i < sources.Count; i++ ) {
        //  sources.g
        //}
    }

基本上,每个 Source 元素都有一个名为"listeners"的属性,它是 Listeners 元素的集合。