亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

利用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系統了啊 ,是不是就想寫數據庫就寫數據庫 想寫文件就寫文件, 寫干啥就干啥了啊~~~~~~

兄弟們啊~~~~~~~

 

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩在线视频网| 国产精品成久久久久三级| 久久久国产视频| 久久久久久91香蕉国产| 热久久99这里有精品| 韩国视频理论视频久久| 久久在线免费观看视频| 一区二区三区视频在线| 日韩中文在线中文网在线观看| 国产在线高清精品| 亚洲欧美制服第一页| 91亚洲午夜在线| 欧美日韩黄色大片| 国产成人极品视频| 在线视频欧美日韩| 日韩麻豆第一页| 久久久天堂国产精品女人| 伊人久久免费视频| 亚洲图片在区色| 亚洲国产高清自拍| 成人久久精品视频| 日韩欧美大尺度| 97超碰色婷婷| 亚洲韩国日本中文字幕| 中文字幕成人在线| 欧美电影《睫毛膏》| 日韩经典中文字幕在线观看| 亚洲精品xxx| 亚洲国产97在线精品一区| 日韩中文视频免费在线观看| 成人久久一区二区三区| 欧美日韩亚洲一区二| 欧美日韩中文字幕在线| 欧美成人精品一区二区三区| 91九色国产社区在线观看| 久久久女人电视剧免费播放下载| 欧美最猛性xxxx| 欧美日韩国产丝袜另类| 国产丝袜视频一区| 国产精品99蜜臀久久不卡二区| 国产精品久久久久91| 国产一区二区三区精品久久久| 久久精品国产一区二区电影| 欧美亚洲国产日本| 国产精品一区二区久久精品| 综合网日日天干夜夜久久| 国产午夜精品视频免费不卡69堂| 欧美成人精品h版在线观看| 欧美激情综合亚洲一二区| 久久久久久久一区二区三区| 日韩国产高清污视频在线观看| 这里只有精品在线播放| 国产主播喷水一区二区| 91中文字幕一区| 亚洲女同精品视频| 欧美精品九九久久| 一区二区av在线| 亚洲bt欧美bt日本bt| 亚洲欧美日韩精品久久| 国产精品精品久久久久久| 尤物99国产成人精品视频| 国产成人亚洲精品| 97在线看福利| 中文字幕亚洲无线码a| 国内免费精品永久在线视频| 亚洲国产欧美一区二区三区同亚洲| 久久99精品久久久久久噜噜| 欧美性猛交xxxx乱大交极品| 欧美性极品xxxx做受| 亚洲日韩欧美视频一区| 久久这里只有精品99| 91久久在线视频| 91精品国产综合久久久久久久久| 精品福利一区二区| 久久久精品视频成人| 国产激情综合五月久久| 91精品久久久久久久久久入口| 亚洲黄页网在线观看| 一区二区三区美女xx视频| 欧美国产在线电影| 激情av一区二区| 亚洲天堂网站在线观看视频| 国产一区二区久久精品| 久久中文字幕在线视频| 精品成人在线视频| 久久久久久91香蕉国产| 成人欧美一区二区三区在线| 一区二区三区视频免费在线观看| 精品视频—区二区三区免费| 欧美天天综合色影久久精品| 最新亚洲国产精品| 欧美精品一区三区| 成人久久一区二区三区| 欧美一级电影在线| 国产一区二区三区四区福利| 性欧美视频videos6一9| 久久久久久亚洲| 国产精品一区二区三| 亚洲欧美日韩网| 日本韩国欧美精品大片卡二| 国产精品欧美风情| 色综合伊人色综合网| 亚洲精品www久久久久久广东| 97免费视频在线播放| 久久精品夜夜夜夜夜久久| 亚洲精品久久久久久久久久久久久| 久久久精品国产网站| 国产精品自拍偷拍| 国产精品欧美激情在线播放| 国产狼人综合免费视频| 欧美日韩一区免费| 成人午夜在线影院| 自拍偷拍亚洲一区| 国产成人+综合亚洲+天堂| 欧美精品做受xxx性少妇| 狠狠久久亚洲欧美专区| 成人黄色在线播放| 日本国产高清不卡| 国产成人亚洲综合91| 国产成人avxxxxx在线看| 中文字幕日韩精品在线观看| 亚洲男人天堂网| 亚洲视频免费一区| 欧美激情精品久久久久久大尺度| 韩国一区二区电影| 欧美自拍大量在线观看| 欧美精品videosex极品1| 2025国产精品视频| 精品久久久久久久久久久久久久| 国产精品中文字幕在线观看| 免费91麻豆精品国产自产在线观看| 亚洲欧洲在线看| 亚洲国产欧美自拍| 亚洲老司机av| 日韩av免费在线看| 欧美日韩精品在线观看| 久热精品视频在线免费观看| 欧美一级bbbbb性bbbb喷潮片| 亚洲另类xxxx| 久久久91精品| 91香蕉嫩草神马影院在线观看| 国产精品男人爽免费视频1| 欧美激情在线观看视频| 亚洲欧美一区二区三区久久| 日韩hd视频在线观看| 国产亚洲视频在线| 国产精品情侣自拍| 国产精品久久不能| 久久久免费高清电视剧观看| 久久久在线观看| 精品国产成人在线| 日韩风俗一区 二区| 91久久国产精品91久久性色| 国产精品香蕉在线观看| 亚洲国产精品va在看黑人| 国产一区二区三区中文| 日本一区二区不卡| 欧美一级视频免费在线观看| 亚洲精品wwww| 亚洲第一页自拍| 亚洲精品美女免费| 亚洲理论片在线观看| 日产精品久久久一区二区福利| 亚洲视频免费一区|