【问题标题】:Formatting trace output格式化跟踪输出
【发布时间】:2010-11-13 09:18:45
【问题描述】:

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

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

【问题讨论】:

    标签: c# debugging formatting trace trace-listener


    【解决方案1】:

    我建议你改用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));
    }
    

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

    【讨论】:

    • 这对Trace.TraceInformation不起作用,因为它先调用Write写源,然后WriteLine写消息,所以日期输出两次。
    • @wezten:感谢您的关注。会指出来,但我不认为我现在会尝试“修复”它。
    【解决方案2】:

    我最近遇到了类似的情况,看起来现在我们有一个非常适合这项任务的工具,即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>
    

    【讨论】:

    • 最简单的安装方法是通过 NuGet:Install-Package Essential.Diagnostics.RollingFileTraceListener(注意:我是 Essential.Diagnostics 的维护者)
    • 另外,我想我会指出“convertWriteToEvent”设置会将Write和WriteLine转换为跟踪事件,因此它们也会获得时间戳。 (尽管使用 TraceSource 可能比 Trace 上的静态方法更好。)
    • 基本诊断已从 codeplex 移至 github。请更新链接:github.com/sgryphon/essential-diagnostics
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        【讨论】:

          【解决方案7】:

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-09-28
            • 2017-12-14
            • 2016-06-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多