조용히 아무것도 수행하지 못하면 System.Diagnostics 추적 문제를 어떻게 해결합니까?TraceSource 및 TraceListener가 조용히 아무것도하지 못함
0
A
답변
0
정말 기쁩니다. 이 문제는 최근에 저에게 일어났습니다. 나는 TraceSwitch
es, TraceSource
s와 TraceListener
의 사슬에서 무언가를 의심했다. 그러나 추적 및 오류 메시지가 없기 때문에 더 많은 정보가 필요했습니다. BCL의 작성자는 모든 진단 정보를 가비지 컬렉터가 느낄 때 사라지는 개인 목록에 유용하게 넣습니다. 아직도, 정보는 충분히 좋았고 반사를 통해 접근 가능했습니다. 그것은 내가 여러개의 TraceSource
을 가지고 있음이 밝혀졌지만 문제의 하나는 스위치가 Off가 아닌 다른 것으로 설정되지 않았다. (또 다른 나쁜 신호는 청취자가 없거나 "기본"청취자 만됩니다.)
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(" ");
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);
}