c#.NET中日誌資訊寫入Windows日誌中解決方案

來源:互聯網
上載者:User

1、 目的
應用系統的開發和維護離不開日誌系統,選擇一個功能強大的日誌系統解決方案是應用系統開發過程中很重要的一部分。在.net環境下的日誌系統解決方案有許多種,log4net是其中的佼佼者。
在Windows2000及以上作業系統中,有一個Windows日誌系統,它包括應用程式(Application)事件記錄、系統(System)日誌和安全(Security)日誌,事件記錄也可以是自訂日誌。在.net Framework中也提供了相應的類和介面來使用應用程式事件記錄檔或者自訂事件記錄。使用Windows日誌可以使應用系統與作業系統更好的結合,與單純使用自訂的日誌系統相比,因為有了作業系統的支援,查詢和管理日誌更方便。在實際應用中,根據實際情況,可以選擇一種合適的日誌解決方案,也可以自訂日誌系統和Windows日誌系統兩種日誌解決方案同時使用。
2、 使用Windows日誌的方法
2.1、方法概述
在.net Framework中提供了一個類EventLog,使用EventLog類可以添加新的事件記錄條目或從伺服器事件記錄中擷取已有的條目。EventLog類包括一個WriteEntry()方法,可以用它來把一個新的事件寫入到事件記錄中。在寫入一個新的條目到事件記錄時,是使用特定的事件來源(event source)來把條目寫入到特定的事件記錄中。
事件來源對於事件記錄而言是唯一的。在Windows2000及以上作業系統中,包括一個事件記錄:應用程式(Application)事件記錄,還有系統(System)日誌和安全(Security)日誌,並且系統允許自訂事件記錄。使用EventLog類,可以將日誌條目添加到應用程式(Application)事件記錄中,也可以添加到自訂事件記錄中。事件來源相當於事件記錄的下一級目錄,每一條日誌條目都必須對應一個事件來源。EventLog類可以建立一個自訂事件記錄,也可以建立一個事件來源,事件來源可以建立在應用程式(Application)事件記錄中,也可以建立在自訂事件記錄中。Windows日誌系統如所示:
為了便於不同應用系統之間的日誌區分和查看方便,一般將事件來源建立在自訂事件記錄中,可以建立多個事件記錄,一個事件記錄也可以建立多個事件來源。
2.2、事件記錄和事件來源建立方法
建立一個新的事件記錄或事件來源時,其實是在對註冊表添加一個條目。由於寫註冊表要求特殊的許可權,所以在Web項目中建立事件記錄和事件來源就存在許可權和安全的問題,Application項目中不存在此問題,本文重點講述Web項目中Windows日誌使用方法,Application項目中的使用方法類似於Web項目,拋棄掉Web項目中的許可權和安全處理即可,本文不再贅述。
在Web項目中,當使用asp.net向系統中建立一個事件記錄或者一個事件來源時,可能會得到如下異常錯誤訊息: System.Security.SecurityException: 不允許所請求的註冊表訪問權。這是因為運行asp.net進程的預設帳戶是ASPNET(在IIS6.0下面是NetworkService),而此賬戶預設只有讀許可權,沒有寫入權限,所以不能建立事件記錄或事件來源。解決此問題的辦法有提升ASPNET帳戶的許可權、不在程式內部建立事件記錄或事件來源等,主要有以下三種解決方案:
A、 在程式運行之前,定義要使用的事件記錄和事件來源,開啟登錄編輯程式,手工將事件記錄和事件來源添加到註冊表中。主要步驟如下:
① 點擊“開始”菜單,再點擊“運行”。
② 在“運行”的“開啟”框中輸入“regedit”,然後按OK按鈕,開啟登錄編輯程式。
③ 在登錄編輯程式中找到下列子鍵:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog
④ 按右鍵“Eventlog”,點擊“建立”,再點“項”,將在“Eventlog”的下一級建立一個新的項目,將此項目命名為“TDDN”, TDDN項就是事件記錄,可以根據實際情況為此項命名,比如可以命名為項目名稱。
⑤ 在“TDDN”項上單擊右鍵,點擊“建立”,再點“項”,將在“TDDN”的下一級建立一個新的項,將此項命名為“Weblog”, Weblog項就是事件來源,此項也可以根據實際情況命名。
⑥ 關閉登錄編輯程式。
這樣事件記錄和事件來源就建好了,如果需要多個事件記錄或事件來源,重複以上過程。這種方法要求對註冊表比較熟悉,操作起來可能有一點複雜,可以寫一個類來實現配置註冊表,只要運行該類便可添加相應的項目,免除了手工添加的繁瑣,這是第二種解決方案,方法如下:
B、 在System.Diagnostics命名空間中有一個EventLogInstaller類,它能夠建立和配置應用程式在運行時要讀寫的事件記錄和事件來源。通過下列步驟,便能夠使用EventLogInstaller類來建立一個事件記錄和事件來源:
① 用C#來建立一個名為EventLogSourceInstaller的“類庫”。
② 在此項目中添加對System.Configuration.Install.dll的引用。
③ 將自動產生的Class1.cs更名為MyEventLogInstaller.cs。
④ 在MyEventLogInstaller.cs中的寫入以下代碼:
using System;
using System.Diagnostics;
using System.ComponentModel;
using System.Configuration.Install;
namespace EventLogSourceInstaller {
[RunInstaller(true)]
public class MyEventLogInstaller: Installer{
public EventLogInstaller myEventLogInstaller;
public MyEventLogInstaller(){
//Create Instance of EventLogInstaller
myEventLogInstaller = new EventLogInstaller();
// Set the Source of Event Log, to be created.
myEventLogInstaller.Source = "WebLog";
// Set the Log that source is created in
myEventLogInstaller.Log = "TDDN";
Installers.Add(myEventLogInstaller);
}
}
}
⑤ 產生此項目,得到EventLogSourceInstaller.dll。
⑥ 開啟Visual Studio .NET 命令提示,轉到EventLogSourceInstaller.dll所在目錄。
⑦ 運行此命令來建立事件記錄和事件來源,運行方法為:輸入命令InstallUtil EventLogSourceInstaller.dll。
這樣程式就在系統中建立一個事件記錄:TDDN,在事件記錄TDDN下建立了一個事件來源:WebLog。
以上的這兩種解決方案都是在應用系統運行之前,為系統手工添加事件記錄和事件來源,這樣做沒有安全許可權問題,不存在安全隱患。更方便的方法還可以在應用系統運行時,讓程式自動建立事件記錄和事件來源,這種方法必須提升ASPNET帳戶的系統操作許可權,或者給asp.net進程一個有更大許可權的類比帳號。類比帳號的實現比較複雜,而且功能和安全性上和提升ASPNET帳戶沒有區別,這裡採用的方法是提升ASPNET帳戶的許可權。以下是第三種解決方案:
C、 提升ASPNET帳戶的許可權可以直接在Windows系統管理中給ASPNET帳戶添加對系統的讀寫權限,但是這樣做存在很嚴重的安全問題,asp.net進程有直接讀寫作業系統的許可權,將給系統帶來很大的安全隱患。這裡採用的提升ASPNET帳戶許可權的方法是只將系統日誌的操作許可權賦給ASPNET帳戶,這樣雖然還存在一定的安全隱患,但是隱患已經大大降低,並且可以在程式內部自由建立事件記錄和事件來源,極大的提高了靈活性。ASPNET帳戶許可權提升方法如下:
① 點擊“開始”,“運行”,輸入“regedit”,開啟登錄編輯程式。
② 在登錄編輯程式中找到下列子鍵:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog
③ 在Eventlog項目上單擊右鍵,在彈出的菜單中選擇“訪問許可”選項,然後找到原生ASPNET帳戶加進來,並賦予讀寫權限。
這樣,ASPNET帳戶就有了讀寫系統日誌的許可權,就可以在程式中根據情況自由建立事件記錄和事件來源了。在程式中建立事件記錄和事件來源的方法如下:
調用 EventLog類的CreateEventSource 方法並指定資料來源字串和要建立的事件記錄名稱,如果將事件記錄名稱指定為空白 (""),事件記錄名稱將預設為Application,這樣不會建立新事件記錄,但會為應用程式(Application)事件記錄建立指定的資料來源。如果建立一個新的事件記錄,則在確定事件記錄名稱是否唯一時將只計算指定字串的前8 個字母。如下代碼所示:
System.Diagnostics.EventLog.CreateEventSource("WebLog", "TDDN");
將建立一個事件記錄為TDDN,在該事件記錄下建立一個事件來源WebLog。要在遠端電腦上建立自訂事件記錄,要將此電腦名稱指定為第三個參數。以下代碼提供了一個樣本:
System.Diagnostics.EventLog.CreateEventSource(" WebLog ", " TDDN ", "myserver");
將在遠端電腦myserver上建立該事件記錄和事件來源。
2.3、寫入Windows日誌的方法
事件記錄與事件來源建立的問題解決了,接下來就可以在程式中將日誌資訊寫入到Windows系統日誌中了。寫入方法是,首先建立EventLog類的一個執行個體,將其Source屬性與事件來源名稱相關聯,最後調用WriteEntry方法來往事件記錄中添加日誌資訊。下面是一段寫入系統日誌的簡單範例程式碼:
EventLog eventLog = null;
if (!(EventLog.SourceExists("WebLog"))){
EventLog.CreateEventSource("WebLog", "TDDN");
}
if (eventLog == null){
eventLog = new EventLog("TDDN");
eventLog.Source = "WebLog";
}
eventLog.WriteEntry("This is error!", EventLogEntryType.Error);
}
上面程式段中首先判斷資料來源“WebLog”是否存在,如果不存在調用CreateEventSource方法建立該事件來源,然後將事件來源與EventLog 類的Source屬性關聯,進行寫操作。傳遞給WriteEntry方法的第一個參數代表要記錄的日誌訊息,可以寫入任何訊息。第二個參數代表事件記錄的類型。
A、 事件記錄類型分類
事件記錄的類型用於指示事件記錄的嚴重度。每個事件必須具有單一的類型,應用程式在報告事件時將指示該類型。事件檢視器使用該類型來確定在日誌的列表視圖中顯示哪一個表徵圖。它分為如下五類:
① Error:錯誤事件,它指示使用者應該知道的嚴重問題(通常是功能或資料的丟失)。
② FailureAudit:失敗審核事件,它指示當審核訪問嘗試失敗(例如開啟檔案的嘗試失敗)時發生的安全事件。
③ Information:資訊事件,它指示重要、成功的操作。
④ SuccessAudit:成功審核事件,它指示當審核訪問嘗試成功(例如成功登入)時發生的安全事件。
⑤ Warning:警告事件,它指示並不立即具有重要性的問題,但此問題可能表示將來會導致問題的條件。
在實際應用中,選擇合適的事件記錄類型,可以使日誌記錄更清晰明了,協助開發維護人員對應用系統更好的監控和維護。
B、 針對事件記錄的五種類型分類,可以在應用程式中寫一個通用的類,為每一個類型寫一個方法來寫入事件記錄。
下面是自訂的通用類的代碼片斷:
public void Error(string sourceName, string message){
EventLog eventLog = null;
if (!(EventLog.SourceExists(sourceName))){
EventLog.CreateEventSource(sourceName, "TDDN");
}
if (eventLog == null){
eventLog = new EventLog("TDDN");
eventLog.Source = sourceName;
}
eventLog.WriteEntry(message, EventLogEntryType.Error);
}
public void Warning(string sourceName, string message){
EventLog eventLog = null;
if (!(EventLog.SourceExists(sourceName))){
EventLog.CreateEventSource(sourceName, "TDDN");
}
if (eventLog == null){
eventLog = new EventLog("TDDN");
eventLog.Source = sourceName;
}
eventLog.WriteEntry(message,System.Diagnostics.EventLogEntryType.Warning);
}
類似的可以寫出其它三種類型的事件記錄寫入方法。該類方法將事件來源(sourceName)和日誌訊息(message)作為參數傳遞,這樣可以提高事件記錄寫入的靈活性。
C、 調用通用類事件記錄寫入的方法
通用類方法的調用非常簡單,如下代碼片斷是調用通用類中Error方法的一個範例:
string strSourceName="WebLog";
CoustomEventLog log=new CoustomEventLog();
log.Error(strSourceName,"This is Error!");
strSourceName是事件來源,log是CoustomEventLog類(即通用類)的一個執行個體,然後調用Error方法將日誌訊息“This is Error!”寫入到事件記錄中。
也可以將程式中拋出的異常資訊寫入事件記錄:
string strSourceName="WebLog";
CoustomEventLog log=new CoustomEventLog();
try{
//執行事件
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.