用EventLog類讀取和寫入系統日誌
阿新 • • 發佈:2019-01-25
作為商業應用程式,尤其是WEB下的應用程式,安全問題是第一位的。這裡所說的安全包括兩個方面,一是系統本身的安全,也就是系統本身的強壯性,另一方面是系統在使用時,使用者的誤操作,或惡意破壞時引起的安全問題。 本文並不想介紹系統全方面的問題,如果你有興趣的可以去查閱相關資料。這裡,我想要介紹的是如何在系統發生錯誤,或者遭到破壞時,如何把相關資訊記錄下來。比如,當有人試圖非法登入的時候,如何記錄下時間,他所在機器的IP等一系列資訊,以便管理員採取相關的措施。 有兩種方式可供選擇,一是將相關資訊寫入指定的資料庫的表中。另一種方法就是寫入系統日誌檔案裡。將資訊寫入資料庫,在.NET環境下,需要例項化許多物件,如SqlConnection ,SqlCommand 等,還要進行資料庫的連線等工作,僅僅是為了插入一條記錄。相對來說,這種方式比較消耗系統資源,如果,系統本身就沒有資料庫支援,那麼這種方法根本不可行。本文要介紹的是第二種方式,將資訊寫入系統日誌。 在.NET的System.Diagnostics名稱空間裡提供了幾個類,專門用來作業系統日誌。 一:向日志裡寫入資訊 首先,我們要引用System.Diagnostics名稱空間。然後,我們來例項化EventLog類,我們的大部分工作都是用這個類來完成。 EventLog sample=new EventLog(); 該類提供的WriteEntry方法,讓我們將資訊寫入系統日誌,一般是寫入應用程式日誌裡。方法的定義如下 public void WriteEntry( string source, string message, EventLogEntryType type, Int eventID, short category, byte[] rawData ); 例如: EventLog.WriteEntr("sourcei","message",EventLogEntryType.Warning ,11,21); 介紹一下該方法引數的含意。 1) Source 表示記錄的來源,字串型 2) Message 表示記錄的相關資訊,字串型 3) Type 表示記錄型別,是列舉型別,有以下選項 ü Error 錯誤 ü Warning 警告 ü Information 資訊 ü SuccessAudit 成功稽核 ü FailureAudit 失敗稽核 4) EventID 表示事件ID號,整型 5) Category 表示事件的分類,短整型 6) RawData 記錄和事件相關的二進位制資訊,位元組陣列 試一下,在事件檢視器的應用程式日誌裡,你會看到剛插入的記錄。 二:從日誌裡讀取資訊 從日誌裡讀取資訊,我們需要使用的是EventLog的Entries方法,該方法返回的是一個集合類EventLogEntryCollection的例項,在該集合類中儲存的是EventLogEntry類的例項,該類中儲存了日誌裡各記錄的資訊。我們可以用以下的程式來返回日誌資訊。 首先,我們要例項化一個EventLog類 EventLog sample=new EventLog(); 和寫入資訊不同的是,我們在這需要指定我們從那個日誌裡讀記錄 sample.Log="Application"; 我們指定的是應用程式日誌,當然,我們可以選擇別的日誌,比如系統日誌System,還有安全日誌Security 宣告一個EventLogEntryCollection類並給它賦值 EventLogEntryCollection myCollection=sample.Entries; 這樣,應用程式日誌裡的資訊都存放在了myCollection物件中,我們可以來讀取其中的資訊。 我們用foreach語句來訪問myCollection中的所有EventLogEntry物件 foreach(EventLogEntry test in myCollection) { Console.WriteLine(test.Message,test.Source,test.EventID); } 這樣,你就可以在螢幕上看到日誌裡的一些資訊,當然,你還可以訪問EventLogEntry物件的其他屬性來獲取你所需要的資訊。 本文只是簡要介紹了一下如何讀寫系統的日誌檔案的方法,有很多細節並沒有詳細介紹,比如,如何讀寫別人機器的日誌,如何出錯處理等,有興趣的化可以參考MSDN using System; using System.Collections.Generic; using System.Text; using System.Diagnostics; namespace Log { class LogWirter { /// <summary> /// 事件源名稱 /// </summary> private string eventSourceName; EventLogEntryType eventLogType; public LogWirter() { eventSourceName = "test"; eventLogType = EventLogEntryType.Error; } /// <summary> /// 訊息事件源名稱 /// </summary> public string EventSourceName { set { eventSourceName = value; } } /// <summary> /// 訊息事件型別 /// </summary> public EventLogEntryType EventLogType { set { eventLogType = value; } } /// <summary> /// 寫入系統日誌 /// </summary> /// <param name="message">事件內容</param> public void LogEvent(string message) { if (!EventLog.SourceExists(eventSourceName)) { EventLog.CreateEventSource(eventSourceName, "Application"); } EventLog.WriteEntry(eventSourceName, message, EventLogEntryType.Error); } } 用C#語言編寫了一個系統日誌方法,請看以下示例: public void WriteEventLog(string argMessage,string argType,int argID,short argCategory, byte[] argRawData) { string strMessage = ""; if (argMessage != null) { strMessage = argMessage; } EventLogEntryType enEntryType = EventLogEntryType.Error; if ((argType == null) || (argType.Length <= 0)) { enEntryType = EventLogEntryType.Error; } else { if (argType.Substring(0, 1) == "I") { enEntryType = EventLogEntryType.Information; } else { if (argType.Substring(0, 1) == "W") { enEntryType = EventLogEntryType.Warning; } } } EventLog eventLog = new EventLog("Application"); eventLog.Source = "xxx系統"; lock(eventLog) { if(m_EventLogFlg==false) { eventLog.WriteEntry(strMessage, enEntryType, argID, argCategory, argRawData); } } } 轉自:http://jinyingboke.blog.163.com/blog/static/99308485201022814542452/