【问题标题】:TraceSource and TraceListener quietly fail to do anythingTraceSource 和 TraceListener 悄悄地什么都不做
【发布时间】:2014-07-03 02:15:30
【问题描述】:

当 System.Diagnostics 跟踪完全无法执行任何操作时,如何对其进行故障排除?

【问题讨论】:

    标签: system.diagnostics tracelistener tracesource


    【解决方案1】:

    我很高兴你问!这个问题最近发生在我身上。我怀疑TraceSwitches、TraceSources 和TraceListeners 链中的某些东西出了差错。但是没有任何痕迹,也没有错误消息,我需要更多信息。 BCL 的作者很有帮助地将所有诊断信息放在一个私有列表中,只要垃圾收集器觉得它的值就会消失。尽管如此,这些信息还是足够好的,并且可以通过反射访问。事实证明,我有几个TraceSource,但有问题的那个没有将 Switch 设置为 Off 以外的其他值。 (另一个不好的迹象是没有监听器或只有“默认”监听器)

    这是带有名为 DumpText 的标签的页面的 Page_Load 事件。我确信这段代码可以适用于控制台或 WinForms。

    protected void Page_Load(object sender, EventArgs e)
    {
        TraceSource ts = new TraceSource("foo");
        List<WeakReference> list = (List<WeakReference>)GetInstanceField(typeof(TraceSource), ts, "tracesources");
        Dictionary<string, TraceSource> sources = new Dictionary<string, TraceSource>();
        foreach (var weakReference in list)
        {
            if (!weakReference.IsAlive) continue;
            TraceSource source = (weakReference.Target as TraceSource);
            if (source == null || source.Name == "foo") continue;
            if (sources.ContainsKey(source.Name)) continue;
            sources.Add(source.Name, source);
        }
        StringBuilder sb = new StringBuilder();
    
        foreach (KeyValuePair<string,TraceSource> kvp in sources.OrderBy((x) => x.Key))
        {
            TraceSource source = kvp.Value;
            if (source == null)
            {
                continue;
            }
            sb.Append("<h3>");
            sb.Append(source.Name);
            sb.Append(" - ");
            sb.Append(source.Switch.Level);
            sb.Append("</h3>");
    
            if (source.Switch.Level == SourceLevels.Off)
            {
                continue;
            }
            foreach (TraceListener l in source.Listeners)
            {
                sb.Append(l.Name);
                sb.Append(" - ");
                sb.Append(l.GetType().ToString());
                sb.Append("<br/>");
    
                foreach (string att in l.Attributes.Values)
                {
                    sb.Append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
                    sb.Append(att);
                    sb.Append(",");
                }
            }
            sb.Append("<br/>");
        }
        this.DumpText.Text = sb.ToString();
    }
    
    internal static object GetInstanceField(Type type, object instance, string fieldName)
        {
            BindingFlags bindFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic
                | BindingFlags.Static;
            FieldInfo field = type.GetField(fieldName, bindFlags);
            return field.GetValue(instance);
        }
    

    【讨论】:

      猜你喜欢
      • 2012-01-23
      • 2015-02-14
      • 2019-02-17
      • 2018-03-26
      • 2019-11-22
      • 2015-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多