System.Diagnostics.TraceSource中的跟踪输出格式

时间:2012-11-08 12:06:17

标签: c# .net system.diagnostics tracesource

以下代码:

static void Main(string[] args)
{
    TraceSource ts = new TraceSource("MyApplication");

    ts.Switch = new SourceSwitch("MySwitch");
    ts.Switch.Level = SourceLevels.All;

    ts.Listeners.Add(new TextWriterTraceListener(Console.Out));

    ts.TraceInformation("Hello World");
    Console.ReadKey();
}

生成以下输出:

  

MyApplication Information:0:Hello World

跟踪输出开头的“MyApplication Information:0:”部分来自TraceSource类本身。

但是,我需要在行的开头加上时间戳,并且我想将“信息”更改为“信息”。

有没有办法在跟踪输出中获得更多自由,以便我可以将其配置为:

  

13:03:00 - MyApplication 信息:Hello World

我尝试了几个小时,但没有成功。无论我做什么,在输出行的开头,始终有这个常量预定义的“MyApplication Information:0:Hello World”输出。

MSDN文档也没有透露任何有用的信息。

4 个答案:

答案 0 :(得分:5)

在跟踪侦听器上设置TraceOutputOptions属性。格式是预定义的,但您可以选择加入由TraceOptions枚举定义的其他数据。

答案 1 :(得分:4)

也迟到了,但万一其他人降落在这里......

我喜欢保持简单。我在App.cs中使用了一个静态Trace方法,它与我在启动时创建的一个TraceSource绑定。这允许我在整个应用程序中访问它并保持app.config简单:

public static void Trace(TraceEventType eventType, string message)
{
    if (_TraceSource.Switch.ShouldTrace(eventType))
    {
        string tracemessage = string.Format("{0}\t[{1}]\t{2}", DateTime.Now.ToString("MM/dd/yy HH:mm:ss"), eventType, message);
        foreach (TraceListener listener in _TraceSource.Listeners)
        {
            listener.WriteLine(tracemessage);
            listener.Flush();
        }
    }
}

我的app.config条目:

  <system.diagnostics>
    <sources>
      <source name="mytracesource" switchValue="All">
        <listeners>
          <add name="mytracelistener"
               type="System.Diagnostics.TextWriterTraceListener"
               initializeData="trace.log">
          </add>
        </listeners>
      </source>
    </sources>
  </system.diagnostics>

答案 2 :(得分:3)

TraceSource.TraceInformation最终会在每个侦听器上调用TraceListener.TraceEvent,并在标头中添加。幸运的是,TraceListener有一个WriteLine方法,可用于生成自定义输出。

static void Main(string[] args)
{
    TraceSource ts = new TraceSource("MyApplication");

    ts.Switch = new SourceSwitch("MySwitch");
    ts.Switch.Level = SourceLevels.All;

    ts.Listeners.Add(new TextWriterTraceListener(Console.Out));

    for (int i = 0; i < ts.Listeners.Count; i++)
    {
        var listener = ts.Listeners[i];

        listener.WriteLine(
            string.Format("{0} - {1} Info: {2}",
            DateTime.Now.ToString("HH:mm:ss"), ts.Name, "Hello World"));
        listener.Flush();
    }
    Console.ReadKey();
}

输出:

  

13:52:05 - MyApplication 信息:Hello World

答案 3 :(得分:1)

也许有点迟了但是如果你想要一个简单易用的解决方案,你应该看看CodePlex上的Essentials Diagnostics项目(也可用through NuGet)。

它定义了广泛的侦听器(允许使用自定义格式),输出到控制台,滚动文本和XML文件,事件日志,电子邮件等,并附带配置示例。