說到日誌,大家都清楚,無非就是記錄:誰,在什麼時候,做了什麼/發生了什麼錯誤,是不是覺得很簡單。這次我也來做一回輪子,一步步教你如何寫自己的日誌協助類。
在開始之前我們需要分析一下日誌協助類(這裡主要指文本日誌)有哪些地方需要注意的:
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介面的代碼。
1 namespace SAS.Interface
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