要記錄log,可以用各種方法,EventLog 只是 Windows 本身提供的一種機制,可以用來記錄應用程式的狀況。
瞭解事件記錄
事件記錄的組成可分成三個部分:
- 事件記錄檔( EventLog ):
- 事件記錄檔是事件的分類,例如系統預設的日誌:應用程式類、安全性、系統...。
- 手動建立:可以在註冊區的 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\ 底下手動加入一個事件記錄檔。
- 程式建立:使用 EventLog.CreateEventSource 這個靜態方法建立。
- 事件( EventLogEntry ):
- 每個事件來源歸屬在一個事件記錄檔裡。
- 包含訊息文字、訊息類別、事件識別碼、工作類別等資訊。
- 必須先取得 EventLog 的執行個體,再由 WriteEntry 方法寫入。
- 事件來源( EventSource ):
- 其名稱是唯一的,不允許重複。
- 事件來源必須歸屬在一個事件記錄檔裡。
- 用來表示事件發生的來源,通常就是以應用程式名稱為主。
存取事件記錄
在.NET的 System.Diagnostics 命名空間裡的 EventLog 物件,提供了與存取 Windows 事件記錄相關的方法。 一般使用 EventLog 類別的靜態方法即可存取 Windows 的事件記錄。 但是,若有一連串的動作,也可以先建立一個 EventLog 的執行個體,再透過該執行個體,進行存取動作。
與 EventLog 相關的方法整理
建立 | 刪除 | 取得 | 判斷是否存在 | |
---|---|---|---|---|
事件記錄檔 | CreateEventSource | Delete | EventLog.GetEventLogs | Exists |
事件來源 | CreateEventSource | DeleteEventSource | SourceExists | |
事件 | WriteEntry | Clear | instLog.Entries |
EventLog 的多載建構子
public EventLog(string logName); public EventLog(string logName, string machineName); public EventLog(string logName, string machineName, string source);
EventLog log1 = new EventLog("application"); //建立 application 事件記錄檔的執行個體。 EventLog log2 = new EventLog("MyApp"); //建立 MyApp 事件記錄檔的執行個體。
瀏覽事件記錄檔
public static EventLog[] GetEventLogs(); public static EventLog[] GetEventLogs(string machineName);
//取得所有事件記錄檔。 EventLog[] EventLogs = EventLog.GetEventLogs(); foreach (EventLog el in EventLogs) { Console.WriteLine("{0} ({1})", el.LogDisplayName, el.Log); } //應用程式 (Application) //安全性 (Security) //系統 (System) //Demo Event Log (Demo Event Log) // ...
建立事件記錄檔
前面提到,事件記錄檔可以在 registry 中,自行定義,也可以使用程式碼。 如果使用程式碼,則可以透過靜態方法 EventLog.Exists ,先判斷事件記錄檔是否已存在,再決定是否建立新的事件記錄檔。
EventLog.CreateEventSource :這個方法可以用來建立新的資料來源,也可以用來建立新的自訂記錄檔。
public static void CreateEventSource(string source, string logName); public static void CreateEventSource(string source, string logName, string machineName); public static void CreateEventSource(EventSourceCreationData sourceData);
string LogFile = "My Test Log"; string EventSource = "Event Source Testing"; //判斷記錄檔是否存在於本機電腦上。 if (!EventLog.Exists(LogFile)) { //建立事件記錄檔。 EventLog.CreateEventSource(EventSource, LogFile); } //刪除事件記錄檔。 EventLog.Delete(LogFile);
建立事件來源
建立事件來源可以先透過靜態方法 EventLog.SourceExists ,先判斷事件記錄檔是否已存在,再決定是否建立新的事件來源。
注意: 事件來源雖然與事件記錄檔相關,但是不同事件記錄檔之間也不允許建立相同的事件來源。
例如,在 LogA 中建立了 EventSourceA ,就不能在 LogB 中建立 EventSourceA 。
但是,這不表示 LogB 中的事件就不能使用 EventSourceA 。
string LogFile = "My Test Log"; string EventSource = "Event Source Testing"; if (!EventLog.SourceExists(EventSource)) //判斷事件來源是否登錄在本機電腦上。 { //建立事件來源 EventLog.CreateEventSource(EventSource, LogFile); } //刪除事件來源 EventLog.DeleteEventSource(source);
建立事件
要建立一個事件,可以使用靜態方法 EventLog.WriteEntry 直接寫入。 若有一連串的動作,也可以先建立一個 EventLog 的執行個體,再透過該執行個體,進行存取。
public void WriteEntry(string message); public void WriteEntry(string message, EventLogEntryType type); public void WriteEntry(string message, EventLogEntryType type, int eventID); public void WriteEntry(string message, EventLogEntryType type, int eventID, short category); public void WriteEntry(string message, EventLogEntryType type, int eventID, short category, byte[] rawData); public static void WriteEntry(string source, string message); public static void WriteEntry(string source, string message, EventLogEntryType type); public static void WriteEntry(string source, string message, EventLogEntryType type, int eventID); public static void WriteEntry(string source, string message, EventLogEntryType type, int eventID, short category); public static void WriteEntry(string source, string message, EventLogEntryType type, int eventID, short category, byte[] rawData); ...
EventLog.WriteEntry 有數個多載方法,其中幾個方法的參數簡單說明如下:
- source:事件來源。
- message:事件訊息內容。
- type:一個事件型別(等級),必須是 EventLogEntryType 列舉型別中的值。
- eventID:事件的應用程式特定識別項。
- category:與訊息相關的應用程式特定的子分類。
EventLogEntryType :事件記錄檔項目的事件型別。
- Error :錯誤事件。這表示是使用者應該知道的重要問題,通常是功能或資料的遺失。
- Warning :警告事件。這表示不是立即重要的問題,但是可能表示將來會引發問題的狀況。
- Information :資訊事件。這表示重要成功的作業。
- SuccessAudit:成功稽核事件。這表示受稽核存取嘗試成功時所發生的安全性事件,例如登錄成功。
- FailureAudit:失敗稽核事件。這表示受稽核的存取嘗試失敗時發生的安全性事件,例如無法開啟檔案。
建立事件
建立事件時,可以透過具名的事件記錄檔的執行個體建立,也可以使用靜態方法直接新增。 不過,不管用哪一個方法,都必須替這個事件指定一個資料來源。
使用靜態方法建立事件時,若指定的資料來源建是新的,那麼這個資料來源會預設使用[應用程式]這個記錄檔。
EventLog.WriteEntry("Event Source", "Event Message"); //具現化一個 EventLog ,並指定記錄檔, 再執行 WriteEntry EventLog Log1 = new EventLog("myEventLog"); Log1.Source = "myEvent Source"; Log1.WriteEntry("Event Message 1...", EventLogEntryType.Information); //具現化一個 EventLog ,不指定記錄檔, EventLog Log2 = new EventLog(); //沒有指定 LogName,會自動根據 Source 判斷相符的 LogName Log2.Source = "myEvent Source"; Log2.WriteEntry("Event Message 2..", EventLogEntryType.Information); //建立帶有[事件識別項]和[事件分類]的Event EventLog log3 = new EventLog(); Log2.Source = "myEvent Source"; Log2.WriteEntry("Event Message 3", EventLogEntryType.Information, 1314, Convert.ToInt16(3)); //最後這二個參數,都是由應用程式自行定義的值。
清除事件
EventLog log = new EventLog("Demo Event Log"); log.Clear(); //清除 Demo Event Log 裡的所有事件記錄
瀏覽事件
EventLog.Entries : 取得特定 EventLog 下的所有事件。該集合由 EventLogEntry 組成。
EventLog log = new EventLog("Demo Event Log"); //取得事件記錄檔。 foreach (EventLogEntry eln in log.Entries) { Console.WriteLine("[Source]:{0} [Message]:{1}", eln.Source, eln.Message); }
範例:列舉應用程式記錄檔中 (Application Log) ,等級為 Warning 和 Error 的訊息
EventLog log = new EventLog("Application"); //create Application Log。 foreach (EventLogEntry entry in log.Entries) { if (entry.EntryType == EventLogEntryType.Warning || entry.EntryType == EventLogEntryType.Error) { Console.WriteLine("[發生時間]:{0} [來源]:{1} [訊息內容]:{2}", entry.TimeGenerated, entry.Source, entry.Message); } }
Note
If a source has already been mapped to a log and you remap it to a new log, you must restart the computer for the changes to take effect.
http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.source.aspx
沒有留言:
張貼留言