2016-07-07 13 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} "); 
    } 
} 
関連する問題