TraceSource和TraceListener悄然无法做任何事情

时间:2014-05-14 20:32:35

标签: system.diagnostics tracelistener tracesource

如果System.Diagnostics跟踪悄然无法执行任何操作,如何对其进行故障排除?

1 个答案:

答案 0 :(得分:0)

我很高兴你问过!这个问题最近发生在我身上。我怀疑TraceSwitch es链中的某些内容,TraceSourceTraceListener s已经出错了。但是没有跟踪和没有错误消息,我需要更多信息。 BCL的作者有助于将所有诊断信息放在一个私有列表中,当垃圾收集器感觉它时,它的值就会消失。不过,信息足够好,可以通过反思访问。事实证明,我有几个TraceSource,但有问题的人没有将Switch设置为Off以外的其他设置。 (另一个不好的迹象是没有听众或只有#34;默认"听众)

这是具有名为DumpText标签的页面的Page_Load事件。我确信这段代码可以适用于Console或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);
    }