【问题标题】:How remove process name from TraceListener output?如何从 TraceListener 输出中删除进程名称?
【发布时间】:2016-11-09 16:20:36
【问题描述】:

我有代码:

 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 如何告诉监听器不要打印进程名称?

【问题讨论】:

    标签: c# .net logging tracelistener


    【解决方案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;
          }
        }
    

    【讨论】:

      【解决方案2】:

      您需要实现自定义跟踪侦听器(例如来自 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} ");
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-15
        • 1970-01-01
        • 2014-04-10
        • 1970-01-01
        • 2012-03-10
        • 1970-01-01
        • 1970-01-01
        • 2016-07-24
        相关资源
        最近更新 更多