现在的位置: 首页 > 综合 > 正文

Effective C# Item36:合理使用.NET运行时诊断

2012年08月01日 ⁄ 综合 ⁄ 共 2123字 ⁄ 字号 评论关闭

    我们的程序总是会出现各种各样的问题,有时发生问题的环境并不在身边,为了应付情况,我们需要懂得如何在系统运行的过程中获得尽可能多的信息,.NET框架包含了一些类,可以帮助我们生成诊断信息。这些类可以在运行时或者编译阶段进行配置,合理的运用它们,我们可以更快的发现问题。

    这些类包括:

System.Diagnostics.Debug
System.Diagnostics.Trace
System.Diagnostics.EventLog

    其中Debug和Trace很像,区别在于Trace是由TRACE指令创建的,而Debug指令是由DEBUG指令创建的。默认情况下,TRACE指令在debug和release两种模式下都定义了,而DEBUG指令只是在debug模式下进行了定义。EventLog类提供了入口使得应用程序可以写到系统事件日志中,它不支持运行时配置。

    下面我们来看如何通过Trace类输出调试信息,整体的结构分为两部分,一部分通过设置TraceSwitch来设置输出信息的级别;一部分通过设置Listener来设置如何将信息输出。

    我们可以在应用程序配置文件中设置TraceSwtich的信息,如下。

代码

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.diagnostics>
<switches>
<add name="MyDebugTool" value="3"/>
</switches>
</system.diagnostics>
</configuration>

    我们在定义Switch的Value值时,是按照TraceLevel的枚举值进行设置的,TraceLevel的枚举值包括:Off、Error、Warning、Info和Verbose,分表表示0到4。

    我们需要在程序中实例化TraceSwitch信息,并且可以定制自己的Listener,来看下面的代码。

代码

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();
}
}

    上述代码中首先定义了一个Listener,注意它必须派生自TraceListener类;另外定义了一个TraceUtility类,用于实例化TraceSwitch对象,并对外公开记录诊断信息的接口。

    下面是测试方法。

代码

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框架提供的用于调试诊断的类来完成这项任务,当它们不满足我们的需求时,我们可以对其进行扩展。

抱歉!评论已关闭.