格式化跟踪输出

时间:2009-07-23 13:21:20

标签: c# debugging formatting trace trace-listener

我正在使用TextWriterTraceListener将诊断消息记录到文本文件中。但是,我也不想记录添加的每条跟踪消息的时间戳。是否可以为侦听器定义一种自动添加时间戳的格式化程序?

目前我正在每次Trace.WriteLine()来电时手动添加时间戳,但这不太舒服。

7 个答案:

答案 0 :(得分:14)

我建议您使用Log4Net代替,它具有更多可自定义性。

或者,您可以编写自己的TraceListener实现,为您设置时间戳。您可能甚至可以从TextWriterTraceListener派生并覆盖WriteWriteLine

public override void Write(string x)
{
     // Use whatever format you want here...
     base.Write(string.Format("{0:r}: {1}", DateTime.UtcNow, x));
}

public override void WriteLine(string x)
{
     // Use whatever format you want here...
     base.WriteLine(string.Format("{0:r}: {1}", DateTime.UtcNow, x));
}

答案 1 :(得分:13)

我最近遇到过类似的情况,现在看来我们有一个非常适合这项任务的工具,即Essential Diagnostics。您可以在app.config中设置一个侦听器,如下面的代码所示,然后将Essential.Diagnostics.dll放入同一个文件夹中。 无需重新调整。您可以将此功能用于使用System.Diagnostics进行跟踪的任何应用程序,即使您不拥有源代码也是如此。这不是很奇妙吗?

<sharedListeners>
  <add name="rollingfile"
    type="Essential.Diagnostics.RollingFileTraceListener, Essential.Diagnostics"
    initializeData="{ApplicationName}-{DateTime:yyyy-MM-dd}.log"
    convertWriteToEvent="true" 
    template="{DateTime:yyyy-MM-dd HH:mm:ss.fff} {Message}{Data}"
  />
</sharedListeners>

答案 2 :(得分:1)

您可以编写自己的TextWriterTraceListener子类来覆盖WriteLine方法,修饰该行,然后将修饰后的字符串传递给基类实现以进行实际输出。

答案 3 :(得分:1)

或者只是将“DateTime”添加为traceOutputOption。

答案 4 :(得分:-1)

不是您的问题的答案,但您是否考虑过使用log4Net

您可以将其配置为添加时间等,以及大量其他有用的功能。

答案 5 :(得分:-1)

答案 6 :(得分:-1)

虽然这已经过时并且答案已被接受,但我还会提出另一个选择。您可以使用codeplex中的Ukadc.Diagnostics插件。除此之外,它还允许您定义自定义格式,类似于您可以使用log4net和NLog定义的格式。它是仅配置依赖项。也就是说,您通过app.config文件配置Ukadc.Diagnostics的使用。没有源依赖项(您继续通过System.Diagnostics记录,而不是通过特殊的API)。话虽如此,您应该注意一些限制:

  1. 当使用TraceSources进行日志记录时,Ukadc.Diagnostics中当前实现的格式化选项实际上只能正常工作。使用Trace.Write和Trace.WriteLine进行日志记录时,未填充TraceEventCache对象,这是大多数格式化对象获取其信息的位置。

  2. 您必须使用Ukadc.Diagnostics TraceListener(或从Ukadc.Diagnostics基础TraceListener派生的自定义侦听器)才能使自定义格式显示在输出中。如果您找到了新的超级duper滚动文件TraceListener,则必须完成一些工作才能将其与Ukadc.Diagnostics格式结合使用。这可能与在Ukadc.Diagnostics基础TraceListener方面重新实现监听器一样困难。或者它可能更容易,如果您可以创建一个新的基于Ukadc.Diagnostics的TraceListener,它包含超级滚动TraceListener,格式化每个Ukadc.Diagnostics的消息,然后委托给包含的侦听器的Write / WriteLine方法。