5

在我的 app.config 中,我想设置 3 个跟踪级别(开关?):详细、警告和无。在代码的调试版本中,我希望详细开关处于活动状态,在发布中我想要警告。在特殊情况下,我的应用程序用户可以修改配置文件以禁用所有跟踪。

我希望在控制台上输出调试跟踪,而仅将跟踪发布到日志文件。

我写了以下内容:

[...]
<system.diagnostics>
        <sources>
            <!-- This section defines the logging configuration for My.Application.Log -->
          <source name="debug" switchName="debug">
            <listeners>
              <add name="FileLog"/>
              <add name="console"/>
            </listeners>
          </source>

          <source name="release" switchName="release">
            <listeners>
              <add name="FileLog"/>
            </listeners>
          </source>

          <source name="silent" switchName="none">
            <listeners/>
          </source>
        </sources>


        <switches>
            <add name="debug" value="Verbose"/>
            <add name="release" value="Warning"/>
            <add name="none" value="Off"/>
        </switches>


        <!--<sharedListeners>
            <add name="FileLog" type="System.Diagnostics.TextWriterTraceListener"  traceOutputOptions="DateTime" initializeData="felix.log"/>
            <add name="console" type="System.Diagnostics.ConsoleTraceListener" initializeData="false" />
        </sharedListeners>-->

        <trace autoflush="false" indentsize="4">
          <listeners>
              <add name="FileLog" type="System.Diagnostics.TextWriterTraceListener" traceOutputOptions="DateTime" initializeData="felix.log"/>
              <add name="console" type="System.Diagnostics.ConsoleTraceListener" initializeData="false"/>
              <remove name="Default"/>
          </listeners>
        </trace>

    </system.diagnostics>
[...]

然后在代码中我这样调用跟踪:

Public Shared Sub HandleException(ByVal ex As Exception)
   Trace.WriteLine(ex.Message, "Error")

[...]

我想我缺少一些东西。我如何对 Trace 方法说正确的开关使用?我的应用程序用户如何更改配置文件以允许跟踪或禁用它?

谢谢。

4

1 回答 1

7

您似乎将通过 Trace.Write 和 Trace.WriteLine 的日志记录/跟踪的概念与使用 TraceSource 对象的日志记录/跟踪混合在一起。

TraceSource 对象允许您拥有可单独控制(通过开关)的“日志记录对象”,这样您就可以为某些代码打开日志记录并为代码的其他部分关闭日志记录。TraceSource 对象的输出可以配置为发送到不同的 TraceListener(或发送到相同的 TraceListener)。Trace.WriteLine 不是很灵活。它只能配置一个级别(即全局您可以在 Debug 或 Info 或其他位置登录),而使用 TraceSources,一个 TraceSource 可以在 Debug 记录,另一个可以在 Info 记录,而另一个可以完全关闭。

有关如何配置 TraceSource 以及如何在代码中使用它们的示例,请参阅这些链接中的答案。

如何跨类使用 TraceSource

通过 app.config 关闭跟踪

记录日志的最佳方法是什么?

将 Trace 方法添加到 System.Diagnostics.TraceListener

关于您希望跟踪/日志记录如何在调试与发布中工作,您可以有两个不同的 app.config 文件。两者都将定义相同的 TraceSources(即同一组“命名”跟踪/记录对象)。在要与调试版本一起使用的 app.config 中,您可以将跟踪/日志记录级别设置为一个值 Debug/Info/Whatever,并且可以将输出定向到控制台和/或文件和/或其他任何内容。在要与调试版本一起使用的 app.config 中,您可以将跟踪/日志记录级别设置为不同的值(或关闭)并将输出定向到文件。

在上面的两篇文章中,我都包含了其他几个指向 System.Diagnostics 信息的链接,包括Ukadc.Diagnostics项目。这个项目提供了一个非常有趣的格式化功能,可用于基于 System.Diagnostics 的 TraceListeners(假设侦听器来自 Ukadc.Diagnostics),而您的实际跟踪/日志记录语句没有任何变化。格式化能力类似于 log4net 和 NLog 提供的。

阅读我上面链接的信息,看看它是否有帮助。尝试使用 TraceSources 而不仅仅是 Trace.WriteLine。当您对此感到满意时,也许可以查看 Ukadc.Diagnostics。

于 2011-01-12T18:18:04.750 回答