欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c#.NET中日志信息寫(xiě)入Windows日志中解決方案

 更新時(shí)間:2007年03月09日 00:00:00   作者:  
1、 目的  
應(yīng)用系統(tǒng)的開(kāi)發(fā)和維護(hù)離不開(kāi)日志系統(tǒng),選擇一個(gè)功能強(qiáng)大的日志系統(tǒng)解決方案是應(yīng)用系統(tǒng)開(kāi)發(fā)過(guò)程中很重要的一部分。在.net環(huán)境下的日志系統(tǒng)解決方案有許多種,log4net是其中的佼佼者。 
在Windows2000及以上操作系統(tǒng)中,有一個(gè)Windows日志系統(tǒng),它包括應(yīng)用程序(Application)事件日志、系統(tǒng)(System)日志和安全(Security)日志,事件日志也可以是自定義日志。在.net Framework中也提供了相應(yīng)的類(lèi)和接口來(lái)使用應(yīng)用程序事件日志或者自定義事件日志。使用Windows日志可以使應(yīng)用系統(tǒng)與操作系統(tǒng)更好的結(jié)合,與單純使用自定義的日志系統(tǒng)相比,因?yàn)橛辛瞬僮飨到y(tǒng)的支持,查詢(xún)和管理日志更方便。在實(shí)際應(yīng)用中,根據(jù)實(shí)際情況,可以選擇一種合適的日志解決方案,也可以自定義日志系統(tǒng)和Windows日志系統(tǒng)兩種日志解決方案同時(shí)使用。 
2、 使用Windows日志的方法  
2.1、方法概述  
在.net Framework中提供了一個(gè)類(lèi)EventLog,使用EventLog類(lèi)可以添加新的事件日志條目或從服務(wù)器事件日志中獲取已有的條目。EventLog類(lèi)包括一個(gè)WriteEntry()方法,可以用它來(lái)把一個(gè)新的事件寫(xiě)入到事件日志中。在寫(xiě)入一個(gè)新的條目到事件日志時(shí),是使用特定的事件源(event source)來(lái)把條目寫(xiě)入到特定的事件日志中。 
事件源對(duì)于事件日志而言是唯一的。在Windows2000及以上操作系統(tǒng)中,包括一個(gè)事件日志:應(yīng)用程序(Application)事件日志,還有系統(tǒng)(System)日志和安全(Security)日志,并且系統(tǒng)允許自定義事件日志。使用EventLog類(lèi),可以將日志條目添加到應(yīng)用程序(Application)事件日志中,也可以添加到自定義事件日志中。事件源相當(dāng)于事件日志的下一級(jí)目錄,每一條日志條目都必須對(duì)應(yīng)一個(gè)事件源。EventLog類(lèi)可以創(chuàng)建一個(gè)自定義事件日志,也可以創(chuàng)建一個(gè)事件源,事件源可以創(chuàng)建在應(yīng)用程序(Application)事件日志中,也可以創(chuàng)建在自定義事件日志中。Windows日志系統(tǒng)如下圖所示:
為了便于不同應(yīng)用系統(tǒng)之間的日志區(qū)分和查看方便,一般將事件源創(chuàng)建在自定義事件日志中,可以創(chuàng)建多個(gè)事件日志,一個(gè)事件日志也可以創(chuàng)建多個(gè)事件源。
2.2、事件日志和事件源創(chuàng)建方法 
創(chuàng)建一個(gè)新的事件日志或事件源時(shí),其實(shí)是在對(duì)注冊(cè)表添加一個(gè)條目。由于寫(xiě)注冊(cè)表要求特殊的權(quán)限,所以在Web項(xiàng)目中創(chuàng)建事件日志和事件源就存在權(quán)限和安全的問(wèn)題,Application項(xiàng)目中不存在此問(wèn)題,本文重點(diǎn)講述Web項(xiàng)目中Windows日志使用方法,Application項(xiàng)目中的使用方法類(lèi)似于Web項(xiàng)目,拋棄掉Web項(xiàng)目中的權(quán)限和安全處理即可,本文不再贅述。
在Web項(xiàng)目中,當(dāng)使用asp.net向系統(tǒng)中創(chuàng)建一個(gè)事件日志或者一個(gè)事件源時(shí),可能會(huì)得到如下異常錯(cuò)誤消息: System.Security.SecurityException: 不允許所請(qǐng)求的注冊(cè)表訪問(wèn)權(quán)。這是因?yàn)檫\(yùn)行asp.net進(jìn)程的默認(rèn)帳戶(hù)是ASPNET(在IIS6.0下面是NetworkService),而此賬戶(hù)默認(rèn)只有讀權(quán)限,沒(méi)有寫(xiě)權(quán)限,所以不能創(chuàng)建事件日志或事件源。解決此問(wèn)題的辦法有提升ASPNET帳戶(hù)的權(quán)限、不在程序內(nèi)部創(chuàng)建事件日志或事件源等,主要有以下三種解決方案:
A、  在程序運(yùn)行之前,定義要使用的事件日志和事件源,打開(kāi)注冊(cè)表編輯器,手工將事件日志和事件源添加到注冊(cè)表中。主要步驟如下:
①     點(diǎn)擊“開(kāi)始”菜單,再點(diǎn)擊“運(yùn)行”。
②     在“運(yùn)行”的“打開(kāi)”框中輸入“regedit”,然后按OK按鈕,打開(kāi)注冊(cè)表編輯器。
③     在注冊(cè)表編輯器中找到下列子鍵:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog
④     右鍵單擊“Eventlog”,點(diǎn)擊“新建”,再點(diǎn)“項(xiàng)”,將在“Eventlog”的下一級(jí)創(chuàng)建一個(gè)新的項(xiàng)目,將此項(xiàng)目命名為“TDDN”, TDDN項(xiàng)就是事件日志,可以根據(jù)實(shí)際情況為此項(xiàng)命名,比如可以命名為項(xiàng)目名稱(chēng)。
⑤     在“TDDN”項(xiàng)上單擊右鍵,點(diǎn)擊“新建”,再點(diǎn)“項(xiàng)”,將在“TDDN”的下一級(jí)創(chuàng)建一個(gè)新的項(xiàng),將此項(xiàng)命名為“Weblog”, Weblog項(xiàng)就是事件源,此項(xiàng)也可以根據(jù)實(shí)際情況命名。
⑥     關(guān)閉注冊(cè)表編輯器。
這樣事件日志和事件源就建好了,如果需要多個(gè)事件日志或事件源,重復(fù)以上過(guò)程。這種方法要求對(duì)注冊(cè)表比較熟悉,操作起來(lái)可能有一點(diǎn)復(fù)雜,可以寫(xiě)一個(gè)類(lèi)來(lái)實(shí)現(xiàn)配置注冊(cè)表,只要運(yùn)行該類(lèi)便可添加相應(yīng)的項(xiàng)目,免除了手工添加的繁瑣,這是第二種解決方案,方法如下:
B、  在System.Diagnostics命名空間中有一個(gè)EventLogInstaller類(lèi),它能夠創(chuàng)建和配置應(yīng)用程序在運(yùn)行時(shí)要讀寫(xiě)的事件日志和事件源。通過(guò)下列步驟,便能夠使用EventLogInstaller類(lèi)來(lái)創(chuàng)建一個(gè)事件日志和事件源:
①     用C#來(lái)創(chuàng)建一個(gè)名為EventLogSourceInstaller的“類(lèi)庫(kù)”。
②     在此項(xiàng)目中添加對(duì)System.Configuration.Install.dll的引用。
③     將自動(dòng)產(chǎn)生的Class1.cs更名為MyEventLogInstaller.cs。
④     在MyEventLogInstaller.cs中的寫(xiě)入以下代碼:
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);
}
}
}
⑤     生成此項(xiàng)目,得到EventLogSourceInstaller.dll。
⑥     打開(kāi)Visual Studio .NET 命令提示,轉(zhuǎn)到EventLogSourceInstaller.dll所在目錄。
⑦     運(yùn)行此命令來(lái)創(chuàng)建事件日志和事件源,運(yùn)行方法為:輸入命令I(lǐng)nstallUtil EventLogSourceInstaller.dll。
這樣程序就在系統(tǒng)中創(chuàng)建一個(gè)事件日志:TDDN,在事件日志TDDN下創(chuàng)建了一個(gè)事件源:WebLog。
以上的這兩種解決方案都是在應(yīng)用系統(tǒng)運(yùn)行之前,為系統(tǒng)手工添加事件日志和事件源,這樣做沒(méi)有安全權(quán)限問(wèn)題,不存在安全隱患。更方便的方法還可以在應(yīng)用系統(tǒng)運(yùn)行時(shí),讓程序自動(dòng)創(chuàng)建事件日志和事件源,這種方法必須提升ASPNET帳戶(hù)的系統(tǒng)操作權(quán)限,或者給asp.net進(jìn)程一個(gè)有更大權(quán)限的模擬帳號(hào)。模擬帳號(hào)的實(shí)現(xiàn)比較復(fù)雜,而且功能和安全性上和提升ASPNET帳戶(hù)沒(méi)有區(qū)別,這里采用的方法是提升ASPNET帳戶(hù)的權(quán)限。以下是第三種解決方案:
C、  提升ASPNET帳戶(hù)的權(quán)限可以直接在Windows系統(tǒng)管理中給ASPNET帳戶(hù)添加對(duì)系統(tǒng)的讀寫(xiě)權(quán)限,但是這樣做存在很?chē)?yán)重的安全問(wèn)題,asp.net進(jìn)程有直接讀寫(xiě)操作系統(tǒng)的權(quán)限,將給系統(tǒng)帶來(lái)很大的安全隱患。這里采用的提升ASPNET帳戶(hù)權(quán)限的方法是只將系統(tǒng)日志的操作權(quán)限賦給ASPNET帳戶(hù),這樣雖然還存在一定的安全隱患,但是隱患已經(jīng)大大降低,并且可以在程序內(nèi)部自由創(chuàng)建事件日志和事件源,極大的提高了靈活性。ASPNET帳戶(hù)權(quán)限提升方法如下:
①     點(diǎn)擊“開(kāi)始”,“運(yùn)行”,輸入“regedit”,打開(kāi)注冊(cè)表編輯器。
②     在注冊(cè)表編輯器中找到下列子鍵:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog
③     在Eventlog項(xiàng)目上單擊右鍵,在彈出的菜單中選擇“訪問(wèn)許可”選項(xiàng),然后找到本機(jī)的ASPNET帳戶(hù)加進(jìn)來(lái),并賦予讀寫(xiě)權(quán)限。
這樣,ASPNET帳戶(hù)就有了讀寫(xiě)系統(tǒng)日志的權(quán)限,就可以在程序中根據(jù)情況自由創(chuàng)建事件日志和事件源了。在程序中創(chuàng)建事件日志和事件源的方法如下:
調(diào)用 EventLog類(lèi)的CreateEventSource 方法并指定數(shù)據(jù)源字符串和要?jiǎng)?chuàng)建的事件日志名稱(chēng),如果將事件日志名稱(chēng)指定為空 (""),事件日志名稱(chēng)將默認(rèn)為Application,這樣不會(huì)創(chuàng)建新事件日志,但會(huì)為應(yīng)用程序(Application)事件日志創(chuàng)建指定的數(shù)據(jù)源。如果創(chuàng)建一個(gè)新的事件日志,則在確定事件日志名稱(chēng)是否唯一時(shí)將只計(jì)算指定字符串的前8 個(gè)字母。如下代碼所示:
System.Diagnostics.EventLog.CreateEventSource("WebLog", "TDDN");
將創(chuàng)建一個(gè)事件日志為T(mén)DDN,在該事件日志下創(chuàng)建一個(gè)事件源WebLog。要在遠(yuǎn)程計(jì)算機(jī)上創(chuàng)建自定義事件日志,要將此計(jì)算機(jī)名指定為第三個(gè)參數(shù)。以下代碼提供了一個(gè)示例:
System.Diagnostics.EventLog.CreateEventSource(" WebLog ", " TDDN ", "myserver");
將在遠(yuǎn)程計(jì)算機(jī)myserver上創(chuàng)建該事件日志和事件源。
2.3、寫(xiě)入Windows日志的方法 
事件日志與事件源創(chuàng)建的問(wèn)題解決了,接下來(lái)就可以在程序中將日志信息寫(xiě)入到Windows系統(tǒng)日志中了。寫(xiě)入方法是,首先創(chuàng)建EventLog類(lèi)的一個(gè)實(shí)例,將其Source屬性與事件源名稱(chēng)相關(guān)聯(lián),最后調(diào)用WriteEntry方法來(lái)往事件日志中添加日志信息。下面是一段寫(xiě)入系統(tǒng)日志的簡(jiǎn)單示例代碼:
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);
}
上面程序段中首先判斷數(shù)據(jù)源“WebLog”是否存在,如果不存在調(diào)用CreateEventSource方法創(chuàng)建該事件源,然后將事件源與EventLog 類(lèi)的Source屬性關(guān)聯(lián),進(jìn)行寫(xiě)操作。傳遞給WriteEntry方法的第一個(gè)參數(shù)代表要記錄的日志消息,可以寫(xiě)入任何消息。第二個(gè)參數(shù)代表事件日志的類(lèi)型。
A、 事件日志類(lèi)型分類(lèi)
事件日志的類(lèi)型用于指示事件日志的嚴(yán)重度。每個(gè)事件必須具有單一的類(lèi)型,應(yīng)用程序在報(bào)告事件時(shí)將指示該類(lèi)型。事件查看器使用該類(lèi)型來(lái)確定在日志的列表視圖中顯示哪一個(gè)圖標(biāo)。它分為如下五類(lèi):
①     Error:錯(cuò)誤事件,它指示用戶(hù)應(yīng)該知道的嚴(yán)重問(wèn)題(通常是功能或數(shù)據(jù)的丟失)。
②     FailureAudit:失敗審核事件,它指示當(dāng)審核訪問(wèn)嘗試失?。ɡ绱蜷_(kāi)文件的嘗試失敗)時(shí)發(fā)生的安全事件。
③     Information:信息事件,它指示重要、成功的操作。
④     SuccessAudit:成功審核事件,它指示當(dāng)審核訪問(wèn)嘗試成功(例如成功登錄)時(shí)發(fā)生的安全事件。
⑤     Warning:警告事件,它指示并不立即具有重要性的問(wèn)題,但此問(wèn)題可能表示將來(lái)會(huì)導(dǎo)致問(wèn)題的條件。
在實(shí)際應(yīng)用中,選擇合適的事件日志類(lèi)型,可以使日志記錄更清晰明了,幫助開(kāi)發(fā)維護(hù)人員對(duì)應(yīng)用系統(tǒng)更好的監(jiān)控和維護(hù)。
B、 針對(duì)事件日志的五種類(lèi)型分類(lèi),可以在應(yīng)用程序中寫(xiě)一個(gè)通用的類(lèi),為每一個(gè)類(lèi)型寫(xiě)一個(gè)方法來(lái)寫(xiě)入事件日志。
下面是自定義的通用類(lèi)的代碼片斷:
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);
}
類(lèi)似的可以寫(xiě)出其它三種類(lèi)型的事件日志寫(xiě)入方法。該類(lèi)方法將事件源(sourceName)和日志消息(message)作為參數(shù)傳遞,這樣可以提高事件日志寫(xiě)入的靈活性。
C、 調(diào)用通用類(lèi)事件日志寫(xiě)入的方法
通用類(lèi)方法的調(diào)用非常簡(jiǎn)單,如下代碼片斷是調(diào)用通用類(lèi)中Error方法的一個(gè)范例:
string strSourceName="WebLog";
CoustomEventLog log=new CoustomEventLog();
log.Error(strSourceName,"This is Error!");
strSourceName是事件源,log是CoustomEventLog類(lèi)(即通用類(lèi))的一個(gè)實(shí)例,然后調(diào)用Error方法將日志消息“This is Error!”寫(xiě)入到事件日志中。
也可以將程序中拋出的異常信息寫(xiě)入事件日志:
string strSourceName="WebLog";
CoustomEventLog log=new CoustomEventLog();
try{
//執(zhí)行事件

相關(guān)文章

  • C# char類(lèi)型字符轉(zhuǎn)換大小寫(xiě)的實(shí)現(xiàn)代碼

    C# char類(lèi)型字符轉(zhuǎn)換大小寫(xiě)的實(shí)現(xiàn)代碼

    以下是對(duì)C#中char類(lèi)型字符轉(zhuǎn)換大小寫(xiě)的示例代碼進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下哦
    2013-07-07
  • C#移除字符串中的不可見(jiàn)Unicode字符 案例代碼

    C#移除字符串中的不可見(jiàn)Unicode字符 案例代碼

    最近發(fā)現(xiàn)某個(gè)數(shù)據(jù)采集的系統(tǒng)拿下來(lái)的數(shù)據(jù),有些字段的JSON被莫名截?cái)嗔?,?dǎo)致后續(xù)數(shù)據(jù)分析的時(shí)候解析JSON失敗,這篇文章主要介紹了C#移除字符串中的不可見(jiàn)Unicode字符 ,需要的朋友可以參考下
    2023-02-02
  • C#學(xué)習(xí)筆記之飛行棋項(xiàng)目

    C#學(xué)習(xí)筆記之飛行棋項(xiàng)目

    這篇文章主要為大家詳細(xì)介紹了C#控制臺(tái)實(shí)現(xiàn)飛行棋項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C# Entity Framework中的IQueryable和IQueryProvider詳解

    C# Entity Framework中的IQueryable和IQueryProvider詳解

    這篇文章主要介紹了C# Entity Framework中的IQueryable和IQueryProvider詳解,本文使用實(shí)例分析這兩個(gè)接口的內(nèi)部實(shí)現(xiàn),需要的朋友可以參考下
    2015-01-01
  • C#并行編程之Task同步機(jī)制

    C#并行編程之Task同步機(jī)制

    這篇文章介紹了C#并行編程之Task同步機(jī)制,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • C#實(shí)現(xiàn)字符串首字母大寫(xiě)的方法示例

    C#實(shí)現(xiàn)字符串首字母大寫(xiě)的方法示例

    這篇文章主要給大家介紹了關(guān)于利用C#實(shí)現(xiàn)字符串首字母大寫(xiě)的相關(guān)資料,這是在最近工作中遇到的一個(gè)需求,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • .NET操作NPOI實(shí)現(xiàn)Excel的導(dǎo)入導(dǎo)出

    .NET操作NPOI實(shí)現(xiàn)Excel的導(dǎo)入導(dǎo)出

    NPOI是指構(gòu)建在POI 3.x版本之上的一個(gè)程序,NPOI可以在沒(méi)有安裝Office的情況下對(duì)Word或Excel文檔進(jìn)行讀寫(xiě)操作,下面小編為大家介紹了如何操作NPOI實(shí)現(xiàn)Excel的導(dǎo)入導(dǎo)出,需要的可以參考一下
    2023-09-09
  • C#多線程學(xué)習(xí)之(三)生產(chǎn)者和消費(fèi)者用法分析

    C#多線程學(xué)習(xí)之(三)生產(chǎn)者和消費(fèi)者用法分析

    這篇文章主要介紹了C#多線程學(xué)習(xí)之生產(chǎn)者和消費(fèi)者用法,實(shí)例分析了C#中線程沖突的原理與資源分配的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • C#?winform中ComboBox數(shù)據(jù)綁定的兩種方法及效率詳解

    C#?winform中ComboBox數(shù)據(jù)綁定的兩種方法及效率詳解

    這篇文章主要給大家介紹了關(guān)于C#?winform中ComboBox數(shù)據(jù)綁定的兩種方法及效率,Winform?ComboBox數(shù)據(jù)綁定是指將數(shù)據(jù)源中的數(shù)據(jù)與ComboBox控件進(jìn)行關(guān)聯(lián),需要的朋友可以參考下
    2023-08-08
  • C#幾種排序算法

    C#幾種排序算法

    C#幾種排序算法...
    2007-03-03

最新評(píng)論