Effective C# Item36:合理使用.NET运行时诊断
我们的程序总是会出现各种各样的问题,有时发生问题的环境并不在身边,为了应付情况,我们需要懂得如何在系统运行的过程中获得尽可能多的信息,.NET框架包含了一些类,可以帮助我们生成诊断信息。这些类可以在运行时或者编译阶段进行配置,合理的运用它们,我们可以更快的发现问题。
这些类包括:
System.Diagnostics.Debug
System.Diagnostics.Trace
System.Diagnostics.EventLog
下面我们来看如何通过Trace类输出调试信息,整体的结构分为两部分,一部分通过设置TraceSwitch来设置输出信息的级别;一部分通过设置Listener来设置如何将信息输出。
我们可以在应用程序配置文件中设置TraceSwtich的信息,如下。
代码
我们在定义Switch的Value值时,是按照TraceLevel的枚举值进行设置的,TraceLevel的枚举值包括:Off、Error、Warning、Info和Verbose,分表表示0到4。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.diagnostics>
<switches>
<add name="MyDebugTool" value="3"/>
</switches>
</system.diagnostics>
</configuration>
我们需要在程序中实例化TraceSwitch信息,并且可以定制自己的Listener,来看下面的代码。
代码
上述代码中首先定义了一个Listener,注意它必须派生自TraceListener类;另外定义了一个TraceUtility类,用于实例化TraceSwitch对象,并对外公开记录诊断信息的接口。
internal class MyListener : TraceListener
{
public override void Write(string message)
{
Console.Out.Write(message);
}
public override void WriteLine(string message)
{
Console.Out.WriteLine(message);
}
}
internal class TraceUtility
{
private static TraceSwitch myTraceSwitch = new TraceSwitch("MyDebugTool", "my debug assist tool");
static TraceUtility()
{
MyListener myListener = new MyListener();
myListener.Name = "MyListener";
myListener.IndentLevel = 0;
Trace.Listeners.Add(myListener);
//Trace.Listeners.Add(new TextWriterTraceListener(System.Console.Out));
Trace.Listeners.Add(new TextWriterTraceListener(System.IO.File.CreateText("Output.log")));
}
public static void OutputInfo(TraceLevel level, string message)
{
Trace.WriteLineIf(myTraceSwitch.Level > level, message);
Trace.Flush();
}
}
下面是测试方法。
代码
上面的代码只是一个演示说明的作用,在进入方法和离开方法时,记录了相关的诊断信息。
1 private static void Test()
2 {
3 TraceUtility.OutputInfo(TraceLevel.Warning, "Trace Start");
4 //do something
5 TraceUtility.OutputInfo(TraceLevel.Warning, "Trace End");
6 }
测试方法执行后,一方面会在控制台上输出对应的诊断信息;另一方面也会在exe所在的目录创建一个名为Ouput.log的文本文件,会将所有诊断信息写入到这个文本文件中。
当我们将配置文件中对应的Switch的Value值设置为0后,在运行程序,你会发现控制台中不会输出任何东西,但是文本文件中还是会输出所有的诊断信息。
诊断程序库对诊断和维护已发布的程序来说是必需的,我们可以利用.NET框架提供的用于调试诊断的类来完成这项任务,当它们不满足我们的需求时,我们可以对其进行扩展。
作者:李潘
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。