C# 格式化跟踪输出

C# 格式化跟踪输出,c#,debugging,formatting,trace,trace-listener,C#,Debugging,Formatting,Trace,Trace Listener,我正在使用TextWriterTraceListener将诊断消息记录到文本文件中。然而,我不想记录每个添加的跟踪消息的时间戳。是否可以为侦听器定义一种自动添加时间戳的格式化程序 目前,我正在为每个Trace.WriteLine()调用手动添加时间戳,但这不是很舒服。我建议您改用它,它具有更多的可定制性 或者,您可以编写自己的TraceListener实现,为您添加时间戳。您甚至可以从TextWriterTraceListener派生并重写Write和WriteLine: public over

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

目前,我正在为每个
Trace.WriteLine()
调用手动添加时间戳,但这不是很舒服。

我建议您改用它,它具有更多的可定制性

或者,您可以编写自己的
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));
}

如注释中所述,这会导致
TraceInformation
的日期重复,因为这会调用
Write
两次。使用“适当的”日志框架肯定更好。

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

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


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

考虑使用

或只添加“DateTime”作为跟踪自动选项。

即使这是一个旧选项,并且答案已被接受,我仍将添加一个选项。您可以使用codeplex中的插件。除其他外,它使您能够定义自定义格式,类似于您可以使用log4net和NLog定义的格式。它是一个仅限配置的依赖项。也就是说,您可以通过app.config文件配置Ukadc.Diagnostics的使用。没有源依赖项(您继续通过System.Diagnostics而不是通过特殊api进行日志记录)。尽管如此,您仍应注意一些限制:

  • 当前在Ukadc.Diagnostics中实现的格式化选项仅在使用TraceSources进行日志记录时才能正确工作。使用Trace.Write和Trace.WriteLine进行日志记录时,不会填写TraceEventCache对象,这是大多数格式化对象获取信息的地方

  • 必须使用Ukadc.Diagnostics TraceListener(或从Ukadc.Diagnostics base TraceListener派生的自定义侦听器)来获取要显示在输出中的自定义格式。如果您发现了一个新的超级复制程序滚动文件TraceListener,您将不得不做一些工作,将其与Ukadc.Diagnostics格式化一起使用。这可能与根据Ukadc.Diagnostics base TraceListener重新实现侦听器一样困难。或者,如果您可以创建一个新的基于Ukadc.Diagnostics的TraceListener,该TraceListener包含super duper rolling TraceListener,按照Ukadc.Diagnostics格式化消息,然后委托给包含的侦听器的Write/WriteLine方法,则可能会更简单


  • 我最近遇到了类似的情况,现在看来我们有了一个非常适合这项任务的工具,即。您可以在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
    Write
    WriteLine
    方法不使用此参数编写的
    ,这使得它在我的情况下毫无用处。安装此参数的最简单方法是通过NuGet:Install-Package-Essential.Diagnostics.RollingFileTraceListener(注意:我是Essential.Diagnostics的维护者)也,我想我会指出“convertWriteToEvent”设置会将Write和WriteLine转换为跟踪事件,因此它们也会得到一个时间戳。(虽然使用TraceSource可能比使用跟踪上的静态方法更好。)基本诊断已从codeplex转移到github。请更新链接:这不适用于
    Trace.TraceInformation
    ,因为它首先调用
    Write
    来写入源代码,然后调用
    WriteLine
    来写入消息,所以日期会输出两次。@wezten:感谢您注意到这一点。我会指出,但我不认为我会尝试“修复”它现在。