TraceSource и TraceListener тихо не могут ничего сделать
Как устранить неполадки трассировки System.Diagnostics, когда она вообще ничего не делает?
1 ответ
Я так рад, что ты спросил! Эта проблема случилась со мной недавно. Я подозревал что-то в цепи TraceSwitch
эс, TraceSource
с и TraceListener
с пошло не так. Но без следов и сообщений об ошибках мне нужно было больше информации. Авторы BCL старательно помещают всю диагностическую информацию в закрытый список, значения которого исчезают, когда сборщик мусора чувствует себя так, как он. Тем не менее, информация была достаточно хорошей и доступной для размышлений. Оказалось, что у меня было несколько TraceSource
Но у рассматриваемого не было переключателя, установленного на что-то кроме Off. (Другим плохим признаком будет отсутствие слушателей или только прослушивание по умолчанию)
Это событие Page_Load для страницы с меткой DumpText. Я уверен, что этот код может быть адаптирован для консоли или 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(" ");
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);
}