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


        我们的程序总是会出现各种各样的问题,有时发生问题的环境并不在身边,为了应付情况,我们需要懂得如何在系统运行的过程中获得尽可能多的信息,.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框架提供的用于调试诊断的类来完成这项任务,当它们不满足我们的需求时,我们可以对其进行扩展。

  • 相关阅读:
    JMX堆栈分析
    Python装饰器示例
    安装指定版本capistrano
    Linux CPU使用率含义及原理
    API gateway 之 kong 安装
    Redis内存分析方法
    Elasticsearch集群内的原理
    Elasticsearch基础
    Python智能检测编码并转码
    (转)rabbitmq的web管理界面无法使用guest用户登录
  • 原文地址:https://www.cnblogs.com/wing011203/p/1655004.html
Copyright © 2020-2023  润新知