zoukankan      html  css  js  c++  java
  • C#自带组件

    C#自带组件

    在项目正式上线后,如果出现错误,异常,崩溃等情况

    我们往往第一想到的事就是查看日志

    所以日志对于一个系统的维护是非常重要的

    贯穿所有的日志系统

    日志系统,往往是贯穿一个程序的所有代码的;

    试想一下,如果你的日志完全是由第三方组件提供的;

    那么就意味着,你的所有项目都必须引用这个dll;

    也许你会说自己可以2次封装,那么依然需要所有项目都引用你的这个封装后的log项目

    另一方面

    一些log组件需要实例化后才可以使用,比如log4net,这又意味着你得有一个全局的静态变量,或者你自己二次封装

    但其实微软已经为我们提供了2个十分方便的静态类,用于日志的记录

    System.Diagnostics.Trace和System.Diagnostics.Debug

    关于这2个类的文档可以去看MSDN

    System.Diagnostics.Trace

    System.Diagnostics.Debug

    他的使用真的是非常的方便,以至于你只要使用一次就会爱上他

    不用引用任何dll,因为他是微软自家的东西,就在System.dll中

    调用他的方法也很简单

    复制代码
    using System.Diagnostics;
    
    ...
    ...
         Trace.TraceError("这是一个Error级别的日志");
         Trace.TraceWarning("这是一个Warning级别的日志");
         Trace.TraceInformation("这是一个Info级别的日志");
         Trace.WriteLine("这是一个普通日志");
         Trace.Flush();//立即输出
    ...
    ...
    复制代码

    当然方法不止只有4个,更多的可以参考MSDN

    Trace,Debug的调用方式完全相同,不同的地方在于

    Debug的所有方法都有

    [Conditional("DEBUG")]

    表明了,在Release模式下(没有定义DEBUG常量时),该方法不会被编译的(不是不执行,而是根本不会编译到程序中去)

    也就是说 Debug.XXX() 方法仅在Debug模式下运行,这个又可以为我们省下很多事

    重写日志实现

    Trace和Debug中的方法的默认行为是输出到控制台Console,和Console.Write是一样的

    但是我们通过改变他的监听器TraceListener,来实现更多的操作

    必须实现的方法有

    void Write(string message);
    void WriteLine(string message);

    不过也可以主动重写其他方法

    随便写一个MyTraceListener

    复制代码
    class MyTraceListener : TraceListener
    {
        public override void Write(string message)
        {
            File.AppendAllText("d:\1.log",message);
        }
    
        public override void WriteLine(string message)
        {
            File.AppendAllText("d:\1.log", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss    ") + message + Environment.NewLine);
        }
    }
    复制代码

    现在程序入口中初始化监听器Trace.Listeners

    static void Main(string[] args)
    {
        Trace.Listeners.Clear();  //清除系统监听器 (就是输出到Console的那个)
        Trace.Listeners.Add(new MyTraceListener()); //添加MyTraceListener实例
    }

    在随便来个方法测试下

    复制代码
    private static void Test()
    {
        try
        {
            int i = 0;
            Console.WriteLine(5 / i); //出现除0异常
        }
        catch (Exception ex)
        {
            Trace.TraceError("出现异常:" + ex.Message);//记录日志
        }
    }
    复制代码

    由于大部分方法都是可重写的,所以其实最终输出什么都是可以灵活处理的

    例如这样

    复制代码
    public override void Write(object o, string category)
    {
        string msg = "";
        if (string.IsNullOrWhiteSpace(category) == false) //category参数不为空
        {
            msg = category + " : ";
        }
        if (o is Exception) //如果参数o是异常类,输出异常消息+堆栈,否则输出o.ToString()
        {
            var ex = (Exception)o;
            msg += ex.Message + Environment.NewLine; 
            msg += ex.StackTrace;
        }
        else if(o != null)
        {
            msg = o.ToString();
        }
        WriteLine(msg);
    }
    复制代码
    复制代码
    private static void Test()
    {
        try
        {
            int i = 0;
            Console.WriteLine(5 / i); //出现除0异常
        }
        catch (Exception ex)
        {
            Trace.Write(ex, "计算员工工资出现异常");
        }
    }
    复制代码

    其他的就自己举一反三

    通过配置文件初始化监听器

    通过配置文件初始化监听器比直接写代码稍稍复杂一点,但是也更方便,我们可以快速的,不重新编译系统,即可进行对日志监听器进行设定

    特别是在Web项目中,这将变得更加方便

    我把刚才的MyTraceListener独立成一个项目,编译为dll

    并且为他增加一个构造函数和FilePath属性用于设置将log文件的位置

     MyTraceListener
    配置文件
    复制代码
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.diagnostics>
        <trace autoflush="false" indentsize="4">
          <listeners>
            <clear /><!--清除默认监听器-->
            <!--添加自定义监听器 initializeData 就是初始化参数-->
            <add name="MyTraceListener" type="MyLog.MyTraceListener, MyLog, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" initializeData="d:1.log" />
          </listeners>
        </trace>
        <switches>
          <!--这里可以设定监听级别,可以设置Error,Warning,Info或者留空-->
          <add name="MyTraceListener" value="Error" />
        </switches>
      </system.diagnostics>
    </configuration>
    复制代码

    其中type参数可以这样获得

    typeof(MyLog.MyTraceListener).AssemblyQualifiedName

    Version,Culture,PublicKeyToken 也可以忽略

    测试一下

    没有任何问题

    而且如果你用了log4net等第三方组件的话,只需要在实现TraceListener的项目中引用log4net就可以了

    说完了...拜拜~~

    代码下载

    LogDemo.rar

    我写的文章,除了纯代码,其他的都是想表达一种思想,一种解决方案.希望各位看官不要局限于文章中的现成的代码,要多关注整个文章的主题思路,谢谢!
    我发布的代码,没有任何版权,遵守WTFPL协议(如有引用,请遵守被引用代码的协议)
     
    分类: ASP.NETC#
    标签: C#源码调试日志
  • 相关阅读:
    形象理解ERP(转)
    禁用windows server 2008 域密码复杂性要求策略
    How to adding find,filter,remove filter on display method Form
    Windows Server 2008 R2激活工具
    How to using bat command running VS development SSRS report
    Creating Your First Mac AppGetting Started
    Creating Your First Mac AppAdding a Track Object 添加一个 Track 对象
    Creating Your First Mac AppImplementing Action Methods 实现动作方法
    Creating Your First Mac AppReviewing the Code 审查代码
    Creating Your First Mac AppConfiguring the window 设置窗口
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3639895.html
Copyright © 2011-2022 走看看