Event Logging 技术简介(转载)
1.???? EVENT LOGGING概述
?????? 當錯誤發生時,系統管理員或技術支持需要知道錯誤原因是什么,如何恢復丟失數據和阻止錯誤復現。 WINDOWS的Event-logging服務為此提供了解決方案。應用程序,操作系統或其它系統服務可以向該服務記錄重要的事件消息,如:磁盤空間不 足、沒有訪問權限等。系統管理員可以通過這些消息來確定錯誤發生的原因以及發生的上下文環境。通過定期的查看這些日志還可以幫助管理員在系統造成大的破壞 前發現問題。
Event-logging服務是隨著WINDOWS系統的啟動而被默認啟動的,但可以 通過服務控制面板停止該服務。Windows for Workgroups、Windows NT、及以后以Windows NT技術為基礎的各Windows版本支持該服務,Windows 3.1、Windows 95、Windows 98和Windows CE均不對它提供本地的(Native)支持。
2.???? EVENT LOGGING事件類型
?????? EVENT LOG共有五種事件類型,所有的事件必須只能擁有其中的一種事件類型。
事件類型 | 描述 |
信息 (Information) | 信息事件指很少發生但重要的成功操作。例如, 當Microsoft SQL Server 成功加載后,它可以記錄一條信息日志"SQL Server has started."。注意,當每次系統啟動記錄事件時,適用于主要的服務器服務,不適用于普通的桌面應用程序 (如:Microsoft Excel)。 |
警告 (Warning) | 警告事件指不是直接的、主要的,但是會導致將來問題發生的問題。資源消費是一個產生警告信息的很好的應用。例如, 一個應用程序可以在磁盤空間小時產生一個警告事件。如果應用程序可以在不丟失功能和數據的情況下從這一事件中恢復,那么這是一個典型的警告事件。 |
錯誤 (Error) | 錯誤事件指用戶應該知道的主要的問題。錯誤事件通常指功能和數據的丟失。例如, 如果一個服務不能作為系統引導被加載,那么它會產生一個錯誤事件。 |
成功審核 (Success audit) | 成功審核事件是安全事件,它在一個要被審核的訪問,訪問成功時產生。例如,成功登陸可以產生成功審核事件。 |
失敗審核 (Failure audit) | 失敗審核事件是安全事件,它在一個要被審核的訪問,訪問失敗時產生。例如,打開文件失敗可以產生失敗審核事件。 |
?????? 信息、警告、錯誤三種事件類型一般用于除系統的Security日志以外的日志文件中。而成功審核、失敗審核只用于Security日志中。
3.???? EVENT LOGGING原理
3.1日志文件
?????? Event-logging服務用到的信息都被存放在了注冊表的EventLog鍵下。EventLog鍵下包含幾個子鍵,這些子鍵被叫做日志文件。通常情況下會有三個子鍵,它們是Application, System,和Security。在某些機器上,由于安裝了微軟的其他應用軟件會多出幾個子鍵,常見的有Directory Service, File Replication Service和DNS Server Logs。當應用程序需要讀寫事件日志時,Event-logging服務用注冊表中的日志文件信息來定位資源。下面是Event-logging在注冊表中的結構:
HKEY_LOCAL_MACHINE
?????SYSTEM
??????????CurrentControlSet
???????????????Services
????????????????????EventLog
??????????????????????????????? Application
??????????????????????????????? Security
??????????????????????????????? System
??????????????????????????????? CustomLog
?????? 應用程序和服務用Application日志文件;設備驅動程序用System日志文件;當操作系統的審計功能打開后,審計成功與審計失敗的事件將寫入Security日志文件。應用程序也可以通過在EventLog鍵下再加入一個子鍵項來頂制一個日志文件。(注:Windows NT不支持定制日志文件)。
日志文件通常在%SystemRoot%/System32/Config子目錄或C:\Windows\System32\winevt\Logs(windows7)下:
APPEVENT.EVT:應用事件日志
SECEVENT.EVT:安全事件日志
SYSEVENT.EVT:系統事件日志
事件日志都以.evt做為擴展名,里面都是以Event的二進制格式進行的信息存放。
?
?????? 在注冊表中每個日志文件都有自己的值,Event-logging服務通過這些值來訪問與控制日志文件的相關資源。下表即日志文件的值:
??
名稱 | 類型 | 描述 |
File | REG_EXPAND_SZ | 日志文件的路徑名。路徑名中可以包含環境變量,當包含環境變量時,需要將文件路徑重新定位。如:%SystemRoot%/system32/config/ AppEvent.Evt |
MaxSize | REG_DWORD | 指日志文件增長所能達到的最大物理大小。這個值的增長粒度必須是64KB(0x00010000)。如果這個值不是64K的邊界值(即被64K正除),那么該值將被自動對準到下一個64K的邊界值。該值默認為512KB |
PrimaryModule | REG_EXPAND_SZ | 運用日志文件的主要模塊(事件源)的名字。該值只在日志文件是Security時使用。 |
RestrictGuestAccess | REG_DWORD | 客人和NULL帳號在默認情況下可以訪問Application和Systeme事件日志,如果將該值設為1可以阻止它們的訪問。Security事件日志總是被保護,不允許客人與NULL帳號的訪問。 |
Retention | REG_DWORD | 該值表示事件日志保持的時間。當該值為 0x00000000時表示按需要覆蓋重寫日志。當該值為0xffffffff時表示不允許覆蓋重寫日志。其他值均被解釋為覆蓋“N”天前的日志。天是用 秒來表示的(0x00015180表示一天,0x01e13380表示365天)。該值的增長粒度為86400,當數據不規則時需要進行對齊。默認的值為 0x00093a80(7天) |
Sources | REG_MULTI_SZ | 所有注冊到日志文件下的事件源的鏈表。所有的事件源的名字之間以字符NULL分隔。鏈表最后以兩個NULL終止。鏈表的最后一個名字是日志文件的名字,當有新的事件源加入時,進行自動調整。 |
3.2 事件(EVENT LOG)記錄
?????? 在事件日志中的所有信息都是以事件日志記錄格式(event log record)進行存放的。該結構的名稱是EVENTLOGRECORD。下表是事件日志記錄格式的詳細描述:
?
名稱 | 類型 | 描述 |
Length | DWORD | 事件記錄的大小,單位字節。該長度包括在事件日志記錄結尾加入的用于DWORD對齊的補丁字節。該長度最小56字節。 |
Reserved | DWORD | 保留 |
RecordNumber | DWORD | 記錄的序號。這個值可以用于當標志設為EVENTLOG_SEEK_READ時,ReadEventLog函數從指定的記錄開始讀取。 |
TimeGenerated | DWORD | 條目被提交的時間。指從00:00:00 January 1, 1970(UTC)開始到當前的秒數。 |
TimeWritten | DWORD | 條目被Event-logging服務寫如日志文件的時間。指從00:00:00 January 1, 1970(UTC)開始到當前的秒數。 |
EventID | DWORD | 事件標識號。該值被事件的事件源描述為事件的源名字,用它來定位事件源的消息文件中的源名字符串。 |
EventType | WORD | 事件的類型。在EVENT LOGGING事件類型中有介紹。 |
NumStrings | WORD | 日志中的字符串的個數。這些字符串在StringOffset所指的位置。它們將在顯示給用戶之前被組成消息。 |
EventCategory | WORD | 事件的分類。這個指依賴于事件源。 |
ReservedFlags | WORD | 保留 |
ClosingRecordNumber | DWORD | 保留 |
StringOffset | DWORD | 事件日志記錄中的描述字符串的偏移。 |
UserSidLength | DWORD | UserSid的字節大小。當沒有提供安全標識時,該值為0 |
UserSidOffset | DWORD | 事件日志記錄中的安全標識(SID)的偏移。可以通過LookupAccountSid函數有SID獲得用戶名。 |
DataLength | DWORD | 事件日志記錄中事件細節數據的字節大小。 |
DataOffset | DWORD | 事件日志記錄中事件細節數據的偏移。 |
?????? 寫入事件日志文件的第一條日志的RecordNumber為1,后面的日志序號依次遞增。當日志文件達到最大限制并允許覆蓋重寫時,最早被寫入的日志文件的日志序號就不是1了。可以用GetOldestEventLogRecord函數獲得最老的日志記錄的序號,然后調用GetNumberOfEventLogRecords函數來獲得日志數據。
3.3 事件(EVENT)源
?????? 日志文件下的子鍵叫做事件(EVENT)源。每個事件源是記錄事件日志的軟件或軟件的子控件的名字。應用程序和服務將自己的名字加在Application日志文件或定制日志文件下,設備驅動程序將自己的名字加在System日志文件下,Security日志文件由系統自己使用。所有注冊在日志文件下的事件源,都會被記錄在日志文件的Sources值中(詳見3.1中
日志文件值的Sources的描述)。注冊表結構如下:
?????? HKEY_LOCAL_MACHINE
?????SYSTEM
??????????CurrentControlSet
???????????????Services
????????????????????EventLog
?????????????????????????Application
??????????????????????????????AppName
?????????????????????????Security
?????????????????????????System
??????????????????????????????DriverName
?????????????????????????CustomLog
??????????????????????????????AppName
?????? 應用程序可以通過給定RegisterEventSource函數事件源名字打開事件日志。日志文件中的事件源名字不能重復也不能分層(即,事件源名字不能用‘/’字符)。 每個事件源在注冊表中都有自己的值,這些值為事件日志的還原提供了必要的信息,見下表:
?
名稱 | 類型 | 描述 |
CategoryCount | REG_DWORD | 描述事件種類的數目。(可沒有該值) |
CategoryMessageFile | REG_EXPAND_SZ | 描述種類消息(Message)文件的路徑。種類消息文件中包含著語言相關的種類字符串。該字段可以包含多個文件,文件間用‘;’號分隔。(可沒有該值) |
DisplayNameFile | REG_EXPAND_SZ | 描述存放事件日志本地化名字的文件。當該值不存在時,日志文件子鍵即為該值。 Windwos NT不支持該值。 |
DisplayNameID | REG_DWORD | 事件日志名在消息文件中的消息標識號。消息文件的名字存儲在DisplayNameFile值中。 Windwos NT不支持該值。 |
EventMessageFile | REG_EXPAND_SZ | 描述事件消息(Message)文件的路徑。事件消息文件中包含著語言相關的事件字符串。該字段可以包含多個文件,文件間用‘;’號分隔。該值必須存在,并且必須至少有一個文件。 |
ParameterMessageFile | REG_EXPAND_SZ | 描述參數消息(Message)文件的路徑。參數消息文件中包含著語言相關的參數字符串。該字段可以包含多個文件,文件間用‘;’號分隔。 (可沒有該值) |
TypesSupported | REG_DWORD | 這是一個位掩碼值,表示事件源支持的事件的類型,可以有以下值: EVENTLOG_ERROR_TYPE???? 0x0001 ? |
?????? 當應用程序用RegisterEventSource或OpenEventLog函數去獲得事件日志句柄時,Event-logging服務會在注冊表中查找事件源。例如:在Application日志文件中可能有Microsoft SQL Server 和 Microsoft Excel的事件源。當RegisterEventSource或OpenEventLog打開Application日志文件中的事件源SQL或Excel時,Event-logging服務回返回Application日志文件的句柄。
?????? 當沒有添加新的事件源到注冊表時,應用程序會用Application事件日志。如果應用程序在調用RegisterEventSource時,傳入的事件源不在注冊表中,默認情況下Event-logging服務會打開Application日志文件。但由于沒有消息文件,日志的信息將無法正常的還原。因此,應該為事件日志應用程序在注冊表中添加一個事件源并指定一個消息文件。
3.4 事件(EVENT)種類
?????? 事件種類可以對事件日志進行較細的分類,Event View可以根據該字段進行事件日志過濾。每一個事件源都可以定義自己的有限的事件種類,可以為事件種類定義自己的ID以及字符串描述。事件種類的ID必須是從1開始的連續的數字。事件源支持的事件種類的數目在注冊表的CategoryCount中存儲。事件種類的ID是事件種類字符描述在種類消息文件中的索引,用該索引調用FormatMessage函數可得到事件種類的字符串描述。種類消息文件存儲在注冊表中事件源的CategoryMessageFile值中。當該值不存在時,EventMessageFile值表示該消息文件。
3.5 事件(EVENT)標識
?????? 事件標識唯一的指定一個事件,但不同的事件源允許事件標識重復。每一個事件源可以定義自己的有限的事件,以及對應事件的描述消息。可以根據這些消息還原事件描述的問題。在定義事件描述消息時應盡量讓消息簡明清晰。
?????? 下面是事件標識的格式,它與WINDOWS的錯誤號的定義格式相同。在Event View當中我們看到的事件標識其實時下面格式中的Code部分,即低16位。
31???????????????????????????? 15???????????????????? ???????0
+---+-+-+-----------------------+-------------------------------+
|Sev|C|R|???? Facility????????? |?????????????? Code??????????? |
+----+-+-+---------------------------------+--------------------------------------------+
Sev :嚴重級別。可以有以下值
00 – 成功
01 – 信息
10 – 警告
11 – 錯誤
C :0表示由WINDOWS操作系統編寫占用,1表示其他應用程序占用
R :保留.
Facility :功能號。該值可以是FACILITY_NULL或以下的各值:
FACILITY_ACS
FACILITY_AAF
FACILITY_CERT
FACILITY_COMPLUS
FACILITY_CONTROL
FACILITY_DISPATCH
FACILITY_INTERNET
FACILITY_ITF
FACILITY_MEDIASERVER
FACILITY_MSMQ
FACILITY_RPC
FACILITY_SCARD
FACILITY_SECURITY
FACILITY_SETUPAPI
FACILITY_SSPI
FACILITY_STORAGE
FACILITY_URT
FACILITY_WIN32
FACILITY_WINDOWS
Code :功能代碼的狀態號。
?
?????? 事件標識(低16位)是事件描述字符串在事件消息文件中的索引,可以通過它調用FormatMessage函數獲得事件的字符描述。事件消息文件由注冊表中事件源的EventMessageFile值存儲。事件描述是語言相關并要本地化的。事件描述中允許有占位符,格式為%n,n的范圍是(1~99),%1是第一個。占位符表示要在該位置有插入字符串替換占位符。如下例,.MC文件中一項:
MessageId=0x4
Severity=Error
Facility=System
SymbolicName=MSG_CMD_DELETE
Language=English
File %1 contains %2, which is in error.
?????? 在這中情況下,ReadEventLog函數返回的緩沖區中包含“插入字符串”。EVENTLOGRECORD結構中的NumStrings字段就表示“插入字符串”的數目,而StringOffset字段定位“插入字符串”在緩沖區中的位置。
?????? 事件描述中還可以允許有為參數消息文件中的參數預留的占位符。占位符的格式為%%n,n的范圍是(1~99),%%1中的1表示參數消息在參數消息文件中的標識,即參數消息的索引。該消息也可以用FormatMessage函數獲得。參數消息文件存儲在注冊表中事件源的ParameterMessageFile值中。當該值不存在時,EventMessageFile值表示該消息文件。
?
?????? 還原事件描述,去掉事件描述中的占位符可以用函數FormatMessage。FormatMessage函 數工作時,會將輸入的字符串中的占位符去掉,然后在相同位置,按照占位符n的值插入與之對應的“插入字符串”。當在字符串中發現‘%’號,但不符合 ‘%n’格式時,函數將‘%’去掉,如:‘%%1’處理后為‘%1’。在還原事件描述時,當事件中即有“插入字符串”又有參數消息時,可以通過兩次調用FormatMessage函數進行還原。
?????? “插入字符串”對于事件描述是可選的且是語言無關的。因為它是非本地化的,所以這些信息最好是描述 ‘數值’、‘文件名’或‘用戶名’的字符串,字符串的長度不要超過32K-1字節。“插入字符串”通常應在描述中被當作‘數據’來用,而不是‘語意’來 用。因為事件描述是從語言相關的消息文件中獲得的,如果“插入字符串”以‘語意’方式出現,那么會因為事件描述的語言與“插入字符串”語言的書寫不同或語 法不同而無法正確解釋事件消息。
3.6 消息(MESSAGE)文件
?????? 每個事件源都應該注冊包含事件標識,事件種類,事件參數描述的消息文件。這些信息應該注冊在著冊表的EventMessageFile, CategoryMessageFile和 ParameterMessageFile值中。可以將事件標識,事件種類,事件參數的描述信息放在同一個文件當中,也可以分成三個文件。多個應用程序可以共享同一個消息文件。
?????? 應該把消息文件創建成為一個資源(resource-only)動態庫,這樣它將比普通動態庫小且加載起來快。關于如何創建消息文件可以參看MSDN。
?????? 下面簡單描述一下如何從消息文件中獲得事件消息:
1.?調用RegOpenKeyEx函數打開事件源
2.?調用RegQueryValueEx函數獲得事件源的EventMessageFile值。該值描述了事件消息的消息動態庫的名字,有可能是多個文件。
3.?調用LoadLibraryEx函數加載由步驟2獲得的動態庫。
4.?調用FormatMessage函數,傳入動態庫的句柄及事件的ID號,獲得對應的事件描述。如未獲得事件描述,且消息文件不止一個,重復步驟3,4直到消息文件都處理完或得到了事件描述為止。獲得事件描述后繼續用FormatMessage函數將描述中的“插入字符串”與事件參數的占位符還原。
注:消息文件中的消息資源都是UNICODE編碼的。
3.7 事件(EVENT)數據
?????? 每一個事件都可以包含與事件相關的數據。EVENTLOGRECORD結構的DataLength字段表示這部分數據的長度,DataOffset字段定位數據在緩沖區中的偏移。事件可以在這里填寫屬于自己的必要的信息。在Event View當中我們可以看到,它顯示這部分數據用十六進制模式或文本模式。Event View不知道如何解釋這部分數據,只有事件知道它的真正含義。
4.???? EVENT LOGGING操作
可以用函數OpenEventLog,OpenBackupEventLog,RegisterEventSource,DeregisterEventSource,和CloseEventLog打開和關閉事件日志的句柄。通過事件日志句柄可以對事件日志進行下表描述的操作:
操作 | 函數 |
備份(Backup) | BackupEventLog |
清除(Clear) | ClearEventLog |
監控(Monitor) | NotifyChangeEventLog |
查詢(Query) | GetOldestEventLogRecord,GetNumberOfEventLogRecords |
讀(Read) | ReadEventLog |
寫(Write) | ReportEvent |
OpenEventLog和ReportEvent有一個可選的服務器名參數,指明該操作可以遠程操作。用OpenEventLog函數可以對獲得日志讀或進行管理(備份、清除、監視和查詢)的權限。RegisterEventSource函數可以獲得對日志進行寫的權限。
對事件日志的所有操作都是原子操作。下面是Event-logging服務處理的幾個特殊情況:
u?????? Event-logging服務同時獲得讀寫操作。如果讀操作到了文件尾部,且寫操作還沒有完成,返回"end-of-file"狀態,讀操作失敗;如果寫操作已經完成,返回新記錄。
u?????? Event-logging服務在獲得讀操作前完成清除操作。讀操作失敗,返回"end-of-file"狀態。
u?????? Event-logging服務在獲得寫操作前完成清除操作。清除操作清空文件,寫操作添加新事件日志作為日志文件的開始。
5.???? EVENT LOGGING安全
?????? EVENT LOG的訪問權限根據運行應用程序的用戶帳號的不同而有區別。LocalSystem用 戶是系統特殊帳號,一般服務運用該帳號。Administraotr是由系統管理員帳號構成(Administraotrs組)。ServerOp是由域 管理員帳號構成。World表示所有系統上的所有用戶帳號。
Log | Account | Access ?? | ||
Application | LocalSystem | Read | Write | Clear |
Administrator | Read | Write | Clear | |
ServerOp | Read | Write | Clear | |
World | Read | Write | ||
System | LocalSystem | Read | Write | Clear |
Administrator | Read | Write | Clear | |
ServerOp | Read | Clear | ||
World | Read |
?
Security日志是專為系統設計的,只有Local Security Authority擁有寫安全日志的權限。讀或清除權限可以通過以下兩種授權方式設定:
1.?????? 控 制面板—》管理工具—》本地安全設置—》本地策略—》用戶權利指派—》管理審核和安全日志(manage auditing and security log)。為該項添加要擁有此項權限的用戶帳號或用戶組。管理員組默認擁有該權限。(以上為Win2000下的操作方式)
2.為用戶帳號設定SE_SECURITY_NAME權限(編程實現)。
參考:《Windows Event Logging》,《MSDN》
作者:colorknight
引用自:http://blog.csdn.net/colorknight/article/details/1389065
轉載于:https://blog.51cto.com/13713878410/1538624
總結
以上是生活随笔為你收集整理的Event Logging 技术简介(转载)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DNS(三)--子域授权和视图
- 下一篇: Objective-C 学习记录6--d