【发布时间】:2010-11-13 09:18:45
【问题描述】:
我正在使用TextWriterTraceListener 将诊断消息记录到文本文件中。但是,我也不想记录添加的每条跟踪消息的时间戳。是否可以为侦听器定义一种自动添加时间戳的格式化程序?
目前我在每个 Trace.WriteLine() 调用中手动添加时间戳,但这不是很舒服。
【问题讨论】:
标签: c# debugging formatting trace trace-listener
我正在使用TextWriterTraceListener 将诊断消息记录到文本文件中。但是,我也不想记录添加的每条跟踪消息的时间戳。是否可以为侦听器定义一种自动添加时间戳的格式化程序?
目前我在每个 Trace.WriteLine() 调用中手动添加时间戳,但这不是很舒服。
【问题讨论】:
标签: c# debugging formatting trace trace-listener
我建议你改用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));
}
如 cmets 中所述,这会导致 TraceInformation 的日期重复,因为这会调用 Write 两次。使用“正确”的日志框架肯定会更好。
【讨论】:
Trace.TraceInformation不起作用,因为它先调用Write写源,然后WriteLine写消息,所以日期输出两次。
我最近遇到了类似的情况,看起来现在我们有一个非常适合这项任务的工具,即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>
【讨论】:
您可以编写自己的 TextWriterTraceListener 子类,该子类覆盖 WriteLine 方法,修饰行,然后将修饰后的字符串传递给基类实现以进行实际输出。
【讨论】:
或者只是将“DateTime”添加为 traceOutputOption。
【讨论】:
Write 和 WriteLine 的 TextWriterTraceListener 方法不使用此参数,这在我的情况下无用
不是您的问题的真正答案,但您是否考虑过只使用log4Net?
您可以对其进行配置以添加时间等,以及大量其他有用的功能。
【讨论】:
【讨论】:
即使这是旧的并且答案已被接受,我仍会再提供一个选项。您可以使用 codeplex 的 Ukadc.Diagnostics 插件。除此之外,它使您能够定义自定义格式,类似于您可以使用 log4net 和 NLog 定义的格式。它是仅配置依赖项。也就是说,您通过 app.config 文件配置 Ukadc.Diagnostics 的使用。没有源依赖项(您继续通过 System.Diagnostics 而不是通过特殊 api 进行记录)。话虽如此,您应该注意一些限制:
目前在 Ukadc.Diagnostics 中实现的格式化选项只有在使用 TraceSources 进行日志记录时才能正常工作。使用 Trace.Write 和 Trace.WriteLine 进行日志记录时,不会填充 TraceEventCache 对象,这是大多数格式化对象获取信息的地方。
您必须使用 Ukadc.Diagnostics TraceListener(或派生自 Ukadc.Diagnostics 基础 TraceListener 的自定义侦听器)才能使自定义格式出现在您的输出中。如果您发现了一个新的超级骗子滚动文件 TraceListener,则必须做一些工作才能将它与 Ukadc.Diagnostics 格式结合使用。这可能与根据 Ukadc.Diagnostics 基础 TraceListener 重新实现侦听器一样困难。或者,如果您可以创建一个新的基于 Ukadc.Diagnostics 的 TraceListener,其中包含超级骗子滚动 TraceListener,格式化每个 Ukadc.Diagnostics 的消息,然后委托给包含的侦听器的 Write/WriteLine 方法,那么它可能会更容易。
【讨论】: