如何从TraceListener输出中删除进程名称?

时间:2016-07-07 11:07:20

标签: c# .net logging 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 如何告诉听众不要打印进程名称?

2 个答案:

答案 0 :(得分:1)

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

我反编译了那个监听器,发现没有选择。 但仍有希望。

您可以像这样实现自己的监听器:

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;
      }
    }

答案 1 :(得分:0)

您需要实现自定义跟踪侦听器(例如,来自TextWriterTraceListener),并且只需将替换了源参数值的所有TraceData方法覆盖到基类方法调用之前所需的内容(如果不需要显示任何内容而不是进程(可执行文件) )name - 只传递空字符串),这样结果trance监听器类可能是这样的:

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} ");
    }
}