2016-07-07 36 views
1

我有代碼:如何從TraceListener輸出中刪除進程名稱?

var listener = new TextWriterTraceListener(@"C:\logs\1.log", "myListener") 
     { 
      TraceOutputOptions = TraceOptions.DateTime 
     }; 

     Trace.Listeners.Add(listener); 
     Trace.TraceInformation("Starting..."); 

輸出爲MyProgram.vshost.exe Information: 0 : Starting...DateTime=2016-07-07T10:43:10.5147858Z 如何告訴聽衆不打印進程名?

回答

0

不幸的是,這似乎是不可能的。

我反編譯那個監聽器和發現,沒有選擇到這一點。 但仍有希望。

您可以實現自己的監聽器是這樣的:

public class MyListener : TextWriterTraceListener { 

     public MyListener(Stream s) : base(s) { 
     } 

     public MyListener(string s, string s1) : base(s, s1) { 
     } 

     public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id, string message) { 
     if (this.Filter != null && !base.Filter.ShouldTrace(eventCache, source, eventType, id, message, null, null, null)) 
      return; 
     this.WriteLine(message); 
     this.WriteFooter(eventCache); 
     } 

     private bool IsEnabled(TraceOptions opts) { 
     return (uint)(opts & this.TraceOutputOptions) > 0U; 
     } 

     private void WriteFooter(TraceEventCache eventCache) { 
     if (eventCache == null) 
      return; 
     this.IndentLevel = this.IndentLevel + 1; 
     if (this.IsEnabled(TraceOptions.ProcessId)) 
      this.WriteLine("ProcessId=" + (object)eventCache.ProcessId); 
     if (this.IsEnabled(TraceOptions.LogicalOperationStack)) { 
      this.Write("LogicalOperationStack="); 
      Stack logicalOperationStack = eventCache.LogicalOperationStack; 
      bool flag = true; 
      foreach (object obj in logicalOperationStack) { 
      if (!flag) 
       this.Write(", "); 
      else 
       flag = false; 
      this.Write(obj.ToString()); 
      } 
      this.WriteLine(string.Empty); 
     } 
     if (this.IsEnabled(TraceOptions.ThreadId)) 
      this.WriteLine("ThreadId=" + eventCache.ThreadId); 
     if (this.IsEnabled(TraceOptions.DateTime)) 
      this.WriteLine("DateTime=" + eventCache.DateTime.ToString("o", (IFormatProvider)CultureInfo.InvariantCulture)); 
     if (this.IsEnabled(TraceOptions.Timestamp)) 
      this.WriteLine("Timestamp=" + (object)eventCache.Timestamp); 
     if (this.IsEnabled(TraceOptions.Callstack)) 
      this.WriteLine("Callstack=" + eventCache.Callstack); 
     this.IndentLevel = this.IndentLevel - 1; 
     } 
    } 
0

您需要實現自定義跟蹤監聽器(例如,從TextWriterTraceListener會),只是覆蓋替換爲源參數值都TRACEDATA方法給你的基地需要什麼類方法調用(如果沒有什麼需要顯示而不是進程(可執行文件)名稱 - 只傳遞空字符串),以便結果恍惚監聽器類可能是這樣的:

public class MyTraceListener : TextWriterTraceListener 
{ 
    public MyTraceListener() 
    { } 

    public MyTraceListener(string name) : base(name) 
    { } 

    public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, object data) 
    { 
     base.TraceData(eventCache, "", eventType, id, data); 
    } 

    public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, params object[] data) 
    { 
     base.TraceData(eventCache, "", eventType, id, data); 
    } 

    public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id) 
    { 
     base.TraceEvent(eventCache, "", eventType, id); 
    } 

    public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id, string message) 
    { 
     base.TraceEvent(eventCache, "", eventType, id, message); 
    } 

    public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id, string format, params object[] args) 
    { 
     base.TraceEvent(eventCache, "", eventType, id, format, args); 
    } 

    public override void Write(string message) 
    { 
     Writer.Write($"{message} "); 
    } 

    public override void WriteLine(string message) 
    { 
     Writer.WriteLine($"{DateTime.UtcNow:s}: {message} "); 
    } 
}