格式化跟踪输出
我正在使用TextWriterTraceListener
将诊断消息记录到文本文件中。 但是,我也不想记录添加的每条跟踪消息的时间戳。 是否可以为侦听器定义一种自动添加时间戳的格式化程序?
目前我正在每次Trace.WriteLine()
调用时手动添加时间戳,但这不是很舒服。
我建议您使用Log4Net ,它具有更多的可定制性。
或者,您可以编写自己的TraceListener
实现,为您设置时间戳。 您甚至可以从TextWriterTraceListener
派生并覆盖Write
和WriteLine
:
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)); }
我最近遇到过类似的情况,看起来我们现在有一个非常适合这项任务的工具,即Essential Diagnostics 。 您在app.config中设置了一个侦听器,如下面的代码所示,然后将Essential.Diagnostics.dll
放入同一个文件夹中。 不需要重新调整。 即使您不拥有源,也可以将此用于使用System.Diagnostics进行跟踪的任何应用程序。 那不是很奇妙吗?
您可以编写自己的TextWriterTraceListener子类来覆盖WriteLine方法,修饰该行,然后将修饰后的字符串传递给基类实现来执行实际输出。
或者只是将“DateTime”添加为traceOutputOption。
不是你的问题的答案,但你考虑过只使用log4Net ?
您可以将其配置为添加时间等,以及大量其他有用的function。
考虑使用Logging Application Block
即使这已经过时并且已经接受了答案,我还会再提出一个选择。 您可以使用codeplex中的Ukadc.Diagnostics插件。 除此之外,它还允许您定义自定义格式,类似于您可以使用log4net和NLog定义的格式。 它是仅配置依赖项。 也就是说,您通过app.config文件配置Ukadc.Diagnostics的使用。 没有源依赖项(您继续通过System.Diagnostics记录,而不是通过特殊的API)。 话虽如此,您应该注意一些限制:
-
当使用TraceSources进行日志记录时,当前在Ukadc.Diagnostics中实现的格式化选项实际上只能正常工作。 使用Trace.Write和Trace.WriteLine进行日志记录时,未填充TraceEventCache对象,这是大多数格式化对象获取其信息的位置。
-
必须使用Ukadc.Diagnostics TraceListener(或从Ukadc.Diagnostics基础TraceListener派生的自定义侦听器)才能使自定义格式显示在输出中。 如果您找到了一个新的超级duper滚动文件TraceListener,则必须完成一些工作才能将它与Ukadc.Diagnostics格式结合使用。 这可能与根据Ukadc.Diagnostics基础TraceListener重新实现侦听器一样困难。 或者它可能更容易,如果您可以创建一个新的基于Ukadc.Diagnostics的TraceListener,它包含超级滚动TraceListener,格式化每个Ukadc.Diagnostics的消息,然后委托给包含的侦听器的Write / WriteLine方法。