說到日志,大家都清楚,無非就是記錄:誰,在什么時候,做了什么/發生了什么錯誤,是不是覺得很簡單。這次我也來做一回輪子,一步步教你如何寫自己的日志幫助類。
在開始之前我們需要分析一下日志幫助類(這里主要指文本日志)有哪些地方需要注意的:
1)、日志幫助類是用靜態類,還是用?
2)、日志發生者通過什么方式傳入,參數,還是?
3)、日志通過什么方式寫,同步還是異步?
4)、日志文件保存位置和文件大小控制。
5)、擴展問題。
暫時個人只找到這么多,望大家補充。
下面我就來說自己在這些方面是如何處理的
一、日志幫助類是用靜態類,還是用?
我的選擇是非靜態類,即通過實例化的方式獲取日志幫助類對象,然后調用方法寫日志,具體代碼為:
TextLogHelper LogHelper = new TextLogHelper();
LogHelper.WriteLog(......);
為何要這樣做呢?其實說起來,自己當初寫的好多東西都是靜態,如靜態類,靜態對象、靜態方法等等,因為那玩意兒好使啊,寫起來方便,調用更加方便,為何不用。但是在不斷的碼農生活中,自己慢慢覺得有時候靜態的東西也並不好使,例如:
1)、靜態公共字段/屬性:並發問題,因為調用方都可能會修改值。這里只是說可能存在這種情況;
2)、公共方法:參數個數問題。因為是靜態方法,所以方法內部所需要的信息,只能通過參數的形勢傳入;
3)、靜態字段、屬性維護問題,因為靜態的字段太多,太雜,維護起來自然增加了難度。
4)、面向對象程序開發的一個核心就是多態,所以如果用靜態類的話,就不可能實現多態了。
至於其他的這里就不一一列舉了。還有一點需要指出的是,上述幾點只是想說靜態類存在這些問題,但並非表示任何情況都不適合用靜態類,如工具類,數據轉換類等,就可以采用靜態類方法實現。所以采用靜態類與否,還得根據實際情況而定。
二、日志發生者通過什么方式傳入,參數,還是?
三、日志通過什么方式寫,同步還是異步?
四、日志文件保存位置和文件大小控制。
五、擴展問題。
二、三、四、五幾點我就放在一塊來講述了。
其實日志發生者存在兩種情況:一種是固定的日志發生在,如系統日志,或者框架內部日志;另外一種就是用戶日志,如Web應用程序中,不同的用戶登錄就會面臨不同的日志發生發生着。
先來給出SAS框架中的文本日志類的兩個構造函數:
private TextLogHelper(string logSavePath, bool asynMechanismLog, int logFileSize){...}
public TextLogHelper(Func<ILogUser> getLogUserHandler, string logSavePath, bool asynMechanismLog, int logFileSize){...}
public TextLogHelper(ILogUser logUser, string logSavePath, string asynMechanismLog, string logFileSize){...}
通過上面幾個構造函數,你或許已經看出了上面端倪了:
1)、日志文件保存路徑、同步/異步方式保存日志內容、日志文件大小問題的控制,都是通過構造函數參數傳入的.
2)、日志用戶采用ILogUser的方式,也是為了便於擴展。在擴展方面其實還有一個ILogHelper接口,而本文要將的TextLogHelper就是繼承自ILogHelper接口。
3)、日志發生着通過兩種方式傳入,第一種是委托方式,讓調用方來決定日志發生者是誰;第二種是直接傳遞日志用戶對象進去。
下面給出ILogHelper接口的代碼。
2 {
3 #region using
4 using System;
5 #endregion
6 /// <summary>
7 /// NameSpace :: SAS.Interface
8 /// Creater :: Juvy[david.telvent@gmail.com]
9 /// Create Time :: 2011-11-13 7:50:47
10 /// Function :: 日志幫助類基類
11 /// </summary>
12 public interface ILogHelper
13 {
14 /// <summary>
15 /// 當前日志幫助類所使用的日志用戶
16 /// </summary>
17 Func<ILogUser> GetLogUserHandler { get; set; }
18 /// <summary>
19 /// 寫日志信息
20 /// </summary>
21 /// <param name="message"> 日志信息 </param>
22 void WriteLog( string message);
23 /// <summary>
24 /// 寫日志信息
25 /// </summary>
26 /// <param name="message"> 日志信息 </param>
27 /// <param name="methodName"> 當前出錯的方法名稱 </param>
28 void WriteLog( string message, string methodName);
29 /// <summary>
30 /// 寫日志信息
31 /// </summary>
32 /// <param name="ex"> 異常 </param>
33 void WriteLog(Exception ex);
34 /// <summary>
35 /// 寫日志信息
36 /// </summary>
37 /// <param name="ex"> 異常 </param>
38 /// <param name="message"> 日志信息 </param>
39 void WriteLog(Exception ex, string message);
40 /// <summary>
41 /// 寫日志信息
42 /// </summary>
43 /// <param name="ex"> 異常 </param>
44 /// <param name="message"> 日志信息 </param>
45 /// <param name="methodName"> 當前出錯的方法名稱 </param>
46 void WriteLog(Exception ex, string message, string methodName);
47 }
48 }
日志接口包含五個寫日志的方法,一個獲取日志用戶的屬性。實現起來應該很簡單,所以至於如何實現,在這里就不多講了,留待自我發揮。
現在說說本日志幫助類的兩點不足:
1)、日志級別問題
2)、日志類型問題
好了,本片SAS框架之文本日志類就講到這里了,歡迎大家斧正!
ASP.NET開發技術交流群: 67511751
另:本人想找一些志同道合的人,可以是跟我一起交流技術的,或者是給予鼓勵和支持的,非誠勿擾,謝謝!
QQ:1054930154