使用日志文件

在讲述使用日志之前,需要了解一些准备知识。
首先,要知道应用程序有两个生成版本:

  1. Debug版本:该版本带有调试符合,在调试代码的时候应该选择该版本。由于生成了调试相关的信息,因此该版本的应用程序文件的体积较大,执行效率也较低。
  2. Release版本:发布版本,当调试完应用程序,确定无误后,就要发布应用程序以供用户使用。该版本生成少量的调试信息,或者不生成调试信息,因而文件体积较小,执行的效率也较高。

在项目"属性"-"生成"选项卡里有"定义DEBUG常量"和"定义TRACE常量"两个选项。选中某个选项意味着定义与选项对应的常量。这些常量的本质就是编译符合,例如,选中"定义DEBUG常量"会在编辑时生成一个名为"DEBUG"的条件编译符号;同理,选中"定义TRACE常量"选项就会在编译时加上一个名为"TRACE"的条件编译符合。
那么,定义这些符号有什么作用呢?查看一下Debug类的公共方法的定义,例如,Write方法的定义如下:

[Conditional ("DEBUG")]
public static void Write (object? value)
{
}

然后,再来看另一个类——Trace(也位于System.Diagnostics命名空间下),它与Debug类的使用方法是一样的,该类用于输出跟踪信息,本质上也与Debug类相同,仅仅用途不同而已。Debug类一般用于调试版本,Trace类用于最终的发布版本,用于输出跟踪信息,例如日志。
随后再看看Trace类的公共方法的定义,以WriteLine为例,其定义如下:

        [Conditional("TRACE")]
        public static void WriteLine(string? message);

从Debug类和Trace类的公共方法定义中是否找到了一个共同点?它们都应用了一个ConditionalAttribute特性。该特性可以用于类和类中的方法上,功能是在ConditionalAttribute上指定一个编译符号,在编译时,如果指定的符合存在,才会编译应用了ConditionalAttribute的方法,如果符号不存在,则该方法被忽略,不参与编译。对于Debug类,指定的编译符号是"DEBUG",而为Trace类指定的符号是"TRACE"。
通过上面的分析,读者就知道"定义DEBUG常量"与"定义TRACE常量"两个选项的作用了。如果启用了"定义DEBUG常量"选项,则调用Debug类的方法的代码才会被编译,如果不启用该选项,则调用Debug类的方法的代码被忽略。"定义TRACE常量"选项的功能也类似,与Trace类的公共方法相关,要在启用了"定义TRACE常量"的情况下调用Trace类的方法才会参与编译。
默认情况下,无论是Debug版本还是Release版本的程序都定义了TRACE符号,因此,如果希望使用跟踪日志,通过Trace类来完成会比较合适。
在恰当的时候向日志文件输出一些信息,可以记录应用程序运行的状况,尤其是记录应用程序在运行时出现的错误。一方面,用户可以通过查看日志文件了解错误发生的原因,可以帮助解决程序故障;另一方面,用户可以把日志文件反馈给程序的开发者,开发者通过查看日志文件来了解应用程序发布后的运行状况,也可以辅助开发者修复程序的缺陷。
Trace类有一个静态的Listeners属性,它是一个集合,里面可以包含实现了TraceListener抽象类的对象。DefaultTraceListener类是最常用的类,在程序运行后,一般会生成一个DefaultTraceListener实例,该类可以直接使用。要使用日志文件,需要设置它的LogFileName属性,指定一个文件名,当程序输出跟踪信息时会同时输出到该文件中。文件可以是完整路径如 D:\My.log,也可以是相对路径,例如test.log,就把日志文件放在与当前应用程序相同的目录下。
示例如下:
首先定义一个Test类,分别声明构造函数和析构函数,以及DoTask方法被调用时向日志文件写入记录。

    class Test
    {
        //构造函数
        public Test()=>Trace.WriteLine($"{DateTime.Now.ToString()}: Test类的构造函数被调用。");
        //析构函数
        ~Test()=>Trace.WriteLine($"{DateTime.Now.ToLongTimeString()}: Test类的析构函数被调用。");
        //公共方法
        public void DoTask()=>Trace.WriteLine($"{DateTime.Now.ToLongTimeString()}: DoTask方法被调用。");
    }

在Main方法中输入以下代码:

        static void Main(string[] args)
        {
            DefaultTraceListener listener = null;
            listener = Trace.Listeners[0] as DefaultTraceListener;
            if(listener is null)
            {
                //如果Listeners中没有DefaultTraceListener
                //则创建一个
                listener = new DefaultTraceListener();
                Trace.Listeners.Add(listener);
            }
            //设置日志文件名
            listener.LogFileName = "example.log";
            //开始测试
            Test t = new Test();
            t.DoTask();
        }

使用VS Code运行示例项目,会在项目路径中创建日志文件:/…/使用日志文件Sample/example.log。打开该日志文件,显示跟踪记录信息如下:

01/04/2021 17:32:01: Test类的构造函数被调用。
17:32:01: DoTask方法被调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值