麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

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

2019-11-14 16:45:38
字體:
來源:轉載
供稿:網友

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

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

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

聲明

正文中的代碼只是一個栗子,一個非常簡單的栗子,只是說明這個框架是怎么工作的

具體實現可以自由發揮~~~~

貫穿所有的日志系統

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

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

那么就意味著,你的所有項目都必須引用這個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

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

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

例如這樣

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文件的位置

    public class MyTraceListener : TraceListener    {        public string FilePath { get; private set; }        public MyTraceListener(string filepath)        {            FilePath = filepath;        }        public override void Write(string message)        {            File.AppendAllText(FilePath, message);        }        public override void WriteLine(string message)        {            File.AppendAllText(FilePath, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss    ") + message + Environment.NewLine);        }        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);        }    }
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

 


擼主發飆了.......

#13樓 2014-04-02 09:25 永遠的麥子  
兄弟寫得非常好。
不過我有兩個問題:
1,目前是往文本文件寫,如果同時也要往系統事件或數據庫中寫,要怎么處理?
2,像企業庫這些第三方組件,可以設置按日期或限定文件大小去循環生成日志,這又要怎么處理?
#14樓 2014-04-02 09:26 瀟湘吹雨  
博客君,這個Trace方式,在寫入操作比較頻繁的時候,經常出現很多guid命名的文件,然后寫入的一條內容
#23樓 2014-04-02 10:27 censhao  
不錯,適用簡單的程序。
復雜的程序,比如輕易就能產生幾G日志文件的程序里還是log4net好用。

兄弟們啊,你們真的是來看文章的嗎? 不是我的對手派來玩我的吧...............咳咳....雞凍了.....

好吧,怪我沒說清楚,我再集中這些問題,用一個栗子簡單回答一下

public class MyTraceListener : TraceListener{    log4net _log = new log4net();    public MyTraceListener(string filepath)    {        _log = new log4net();        _log.FilePath = filepath;    }    public override void Write(string message)    {        _log.Info(message);    }    public override void WriteLine(string message)    {        _log.Info(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss    ") + message + Environment.NewLine);    }}

這樣是不是就可以用log4net了啊,是不是就可以用其他log系統了啊 ,是不是就想寫數據庫就寫數據庫 想寫文件就寫文件, 寫干啥就干啥了啊~~~~~~

兄弟們啊~~~~~~~

 

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 91精品国产91久久久久久不卞 | 香蕉黄色网 | 99爱视频 | 91性视频 | 九九热在线免费观看视频 | 欧美视频一区二区三区在线观看 | 黄色毛片一级 | 黄色美女网站免费看 | fc2国产成人免费视频 | 免费观看黄色一级视频 | 欧美性受ⅹ╳╳╳黑人a性爽 | 久久新网址 | 国产91一区二区三区 | 成人在线观看免费视频 | 久久久www免费看片 亚洲综合视频一区 | 久久网站免费 | 国产午夜精品久久久久婷 | 国产1区2| 国产免费黄网 | 万圣街在线观看免费完整版 | 欧美一级久久 | 九九热在线视频观看 | 人成久久 | 国产精品无码久久久久 | 青草久久久久 | 97视频 | 久草视频福利在线观看 | 欧美一级黄视频 | 欧美成人激情在线 | 中文字幕欧美一区二区三区 | 精品亚洲一区二区三区 | 小视频在线看 | 国产91片 | 成人午夜在线播放 | 性生活视频一级 | 日韩深夜视频 | 福利在线小视频 | 免费午夜视频在线观看 | 欧美性生交大片 | 久色视频网站 | 91av亚洲|