国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

利用C#自帶組件強壯程序日志

2019-11-17 01:28:58
字體:
來源:轉載
供稿:網友

利用C#自帶組件強壯程序日志

前言

在項目正式上線后,如果出現錯誤、異常、崩潰等情況,

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

所以日志對于一個系統的維護是非常重要的。

聲明

本文中的示例代碼旨在這個框架是怎么工作的,具體實現可以自由發揮。

貫穿所有的日志系統

日志系統,往往是貫穿一個程序的所有代碼的;

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

那么就意味著,你的所有項目都必須引用這個dll;

也許你會說自己可以2次封裝,那么依然需要所有項目都引用你的這個封裝后的log項目,

另一方面

一些log組件需要實例化后才可以使用,比如log4net,這又意味著你得有一個全局的靜態變量,或者你自己二次封裝,

但其實微軟已經為我們提供了2個十分方便的靜態類,用于日志的記錄。

System.Diagnostics.Trace和System.Diagnostics.Debug

關于這2個類的文檔可以去看MSDN

System.Diagnostics.Trace

System.Diagnostics.Debug

它使用非常方便,不用引用任何dll。

調用它的方法也很簡單

using System.Diagnostics;
...
...
     Trace.TraceError("這是一個Error級別的日志");
     Trace.TraceWarning("這是一個Warning級別的日志");
     Trace.TraceInformation("這是一個Info級別的日志");
     Trace.WriteLine("這是一個普通日志");
     Trace.Flush();//立即輸出
...
...
當然方法不止只有4個,更多的可以參考MSDN。Trace,Debug的調用方式完全相同,不同的地方在于Debug的所有方法都有:
[Conditional("DEBUG")]

012117~1

表明了,在Release模式下(沒有定義DEBUG常量時),該方法不會被編譯的(不是不執行,而是根本不會編譯到程序中去)。

也就是說 Debug.XXX() 方法僅在Debug模式下運行,這個又可以為我們省下很多事。


重寫日志實現

Trace和Debug中的方法的默認行為是輸出到控制臺Console,和Console.Write是一樣的。

但是我們通過改變他的監聽器TraceListener,來實現更多的操作,

必須實現的方法有:

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

不過也可以主動重寫其他方法。

012130~1

隨便寫一個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。

PS下:Trace和Debug的監聽器的共用的。

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);//記錄日志
    }
}

image

由于大部分方法都是可重寫的,所以其實最終輸出什么都是可以非常靈活。

通過配置文件初始化監聽器

通過配置文件初始化監聽器比直接寫代碼稍稍復雜一點,但是也更方便,我們可以快速的,不重新編譯系統,即可進行對日志監聽器進行設定。

演示如下:


示例:

我們將ProjectTraceListener獨立成一個項目,編譯為dll。

ProjectTraceListener.cs

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Text;
   4: using System.Diagnostics;
   5: using System.IO;
   6:  
   7: namespace ProjectLog
   8: {
   9:     public class ProjectTraceListener : TraceListener
  10:     {
  11:         public string FilePath { get; private set; }
  12:  
  13:         public ProjectTraceListener(string filePath)
  14:         {
  15:             FilePath = filePath;
  16:         }
  17:  
  18:         public override void Write(string message)
  19:         {
  20:             File.AppendAllText(FilePath, message);
  21:         }
  22:         public override void WriteLine(string message)
  23:         {
  24:             File.AppendAllText(FilePath, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss    ") + message + Environment.NewLine);
  25:         }
  26:         public override void Write(object o, string category)
  27:         {
  28:             string message = string.Empty;
  29:             if (!string.IsNullOrEmpty(category))
  30:             {
  31:                 message = category + ":";
  32:             }
  33:             if (o is Exception)//如果參數對象o是與Exception類兼容,輸出異常消息+堆棧,否則輸出o.ToString()
  34:             {
  35:                 var ex = (Exception)o;
  36:                 message += ex.Message + Environment.NewLine;
  37:                 message += ex.StackTrace;
  38:             }
  39:             else if(null != o)
  40:             {
  41:                 message += o.ToString();
  42:             }
  43:  
  44:             WriteLine(message);
  45:         }
  46:     }
  47: }

在控制臺項目中測試:

App.config

   1: <?xml version="1.0" encoding="utf-8" ?>
   2: <configuration>
   3:   <system.diagnostics>
   4:     <trace autoflush="false" indentsize="4">
   5:       <listeners>
   6:         <clear/>
   7:         <!--清除默認監聽器-->
   8:         <!--添加自定義監聽器 initializeData 就是初始化參數-->
   9:         <add name="ProjectTraceListener" type="ProjectLog.ProjectTraceListener, ProjectLog, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" initializeData="d:/Error.log" />
  10:       </listeners>
  11:     </trace>
  12:     <switches>
  13:       <!--這里可以設定監聽級別,可以設置Error,Warning,Info或者留空-->
  14:       <add name="ProjectTraceListener" value="Error" />
  15:     </switches>
  16:   </system.diagnostics>
  17: </configuration>

Program.cs

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Text;
   4: using System.Diagnostics;
   5: using ProjectLog;
   6:  
   7: namespace ProjectLogDemo
   8: {
   9:     class Program
  10:     {
  11:         static void Main(string[] args)
  12:         {
  13:             //刪除初始化代碼,改為在配置文件中設置
  14:             //Trace.Listeners.Clear();  //清除系統監聽器 (就是輸出到Console的那個)
  15:             //Trace.Listeners.Add(new ProjectTraceListener(@"d:/Error.log")); //添加ProjectTraceListener實例
  16:             Test();
  17:         }
  18:  
  19:         private static void Test()
  20:         {
  21:             try
  22:             {
  23:                 int i = 0;
  24:                 Console.WriteLine(5 / i); //出現除0異常
  25:             }
  26:             catch (Exception ex)
  27:             {
  28:                 Trace.Write(ex, "計算員工工資出現異常");
  29:             }
  30:         }
上一篇:asp.net 認證與授權

下一篇:asp.net 緩存

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 望谟县| 永宁县| 黄浦区| 乳源| 丰台区| 晋州市| 天峨县| 苏尼特左旗| 万盛区| 涟水县| 务川| 米泉市| 怀仁县| 建平县| 突泉县| 罗江县| 永年县| 敦煌市| 刚察县| 临漳县| 桃源县| 姜堰市| 泾阳县| 镇原县| 黎城县| 临清市| 巴里| 华宁县| 马鞍山市| 南川市| 轮台县| 博爱县| 原阳县| 衢州市| 溧水县| 邯郸县| 安徽省| 潮州市| 辽宁省| 钟山县| 三河市|