作者Swigart Consulting LLC 的 Scott Swigart
簡介
Visual Basic 可通過AppLogEvent寫入事件日志但是此 API 有許多嚴格的限制首先不能為事件定義來源(在事件查看器中始終顯示為VBRuntime)而且不能指定事件 ID 或事件類別還限制您只能寫入應用程序事件日志不能創建自己的自定義來源和日志
通過使用 NET Framework 免費提供的類可以克服所有這些限制這樣可以使您有效地編寫應用程序以便用戶管理員或其他支持人員都可以查看日志來診斷問題
NET Framework EventLog 類
NET Framework 提供了一個強大的 EventLog 類用它可以輕松地處理事件日志不過您不能直接從 VB 訪問此類依照 VB Fusion(英文)系列文章中的精神可以通過創建封裝 NET 類的 COM 包裝從 VB 中訪問此功能
我還創建了一個練習此事件日志功能的示例 VB 應用程序
圖 使用事件日志功能的 VB 應用程序
創建包裝類時大部分工作只是將 NET 類型轉換為 VB 可以理解的類型GetEventLogs 方法通常返回一組 EventLog 對象不過不能直接從 VB 中使用這些 EventLog 對象但是下列 VBNET 函數將計算機上的所有事件日志的列表轉換為一組字符串VB 很容易就可以使用這些字符串通常您擁有系統事件日志安全性事件日志和應用程序事件日志但是某些應用程序還會創建自己的自定義事件日志而此方法還可以顯示這些事件日志
清單 使用 VBNET 列出計算機上的所有事件日志
Public Function GetEventLogs() As String()
Dim logs(EventLogGetEventLogsLength ) As String
Dim i As Integer =
For Each el As EventLog In EventLogGetEventLogs()
logs(i) = elLog
i +=
Next
Return logs
End Function
您可以看到EventLog 類使您能夠通過 GetEventLogs 函數訪問所有事件日志調用此函數後它就會遍歷結果並將所有事件日志名稱轉換為一組字符串然後可以將此 VBNET 代碼作為 COM 對象進行公開從而允許從 VB 中調用它
從 VB 中調用此代碼以及(例如)用結果填充列表框就像下面這樣簡單
清單 使用 VB 在列表框中顯示日志名稱
Dim eventLog As NetFrameworkWrappersEventLogWrapper
Set eventLog = New NetFrameworkWrappersEventLogWrapper
lstEventLogsClear
Dim logs() As String
logs = eventLogGetEventLogs
Dim log As Variant
For Each log In logs
lstEventLogsAddItem log
Next
方法
由於各種原因您可能希望應用程序能夠寫入事件日志當然應該將任何災難性錯誤都記錄到事件日志中因為此信息以後可以用來診斷問題您可能經常希望將不適合顯示給用戶的詳細信息寫入該事件日志中
首先需要選擇使用哪個日志可以從系統事件日志安全性事件日志或應用程序事件日志中進行選擇應用程序事件日志幾乎總是正確的選擇但是如果需要也可以創建自己的自定義事件日志事件日志包裝中的下列 VBNET 代碼使您能夠創建自己的自定義日志
清單 使用 VBNET 創建自定義事件日志
Public Sub CreateEventSource(ByVal source As String ByVal logName As String)
If EventLogSourceExists(source) Then
EventLogDeleteEventSource(source)
End If
EventLogCreateEventSource(source logName)
End Sub
您可以看到使用 NET Framework 可以輕松創建事件日志NET CreateEventSource 方法幫您完成了所有工作此方法只提供了該功能以便可以從 VB 中輕松調用
清單 使用包裝類從 VB 創建事件日志
Dim eventLog As NetFrameworkWrappersEventLogWrapper
Set eventLog = New NetFrameworkWrappersEventLogWrapper
eventLogCreateEventSource MyApplication MyCustomLog
向事件日志寫入條目同樣很簡單WriteEntry VBNET 方法可以實現該事件日志功能並提供該功能以便可以從 VB 中調用該方法
清單 在 VBNET 中向事件日志寫入條目
Public Sub WriteEntry(ByVal source As String _
ByVal message As String _
Optional ByVal type As String = Information _
Optional ByVal eventID As Integer = _
Optional ByVal category As Short = )
Dim typeEnum As EventLogEntryType = _
SystemEnumParse(GetType(EventLogEntryType) type)
m_eventLogWriteEntry(source message typeEnum eventID category)
End Sub
此包裝方法提供了許多可選參數因此從 VB 中調用該方法時您可以僅傳遞事件日志來源和消息也可以傳遞消息類型事件 ID 和/或事件類別
可以使用下列代碼從 VB 中調用此方法
清單 在 VB 中寫入事件日志條目
Dim eventLog As NetFrameworkWrappersEventLogWrapper
Set eventLog = New NetFrameworkWrappersEventLogWrapper
eventLogWriteEntry cboLogText txtMessage cboTypeText _
txtID txtCategory
讀取日志
從事件日志中讀取信息只是稍微有些復雜NET Framework EventLog 類有一個 GetEntries 方法它可以返回給定(應用程序系統等)事件日志的所有日志條目問題是每個條目都是作為 EventLogEntry 對象返回的不能將它們直接傳遞回 VB但是我可以簡單地創建自己的 EventLogEntryInfo 類用於將每個事件日志條目復制到其中它是一個完整的 COM 類可以返回到 VB並且提供了條目來源消息類型ID 和類別屬性然後VBNET 代碼將使用事件日志條目數據填充這些屬性並將其返回以便可以從 VB 中使用
清單 在 VBNET 中讀取並轉換事件日志條目
Public Sub GetEntries(ByRef entries() As EventLogEntryInfo)
ReDim entries(m_eventLogEntriesCount )
For i As Integer = To m_eventLogEntriesCount
Dim ent As EventLogEntry = m_eventLogEntries(i)
entries(i) = New EventLogEntryInfo
entries(i)Category = entCategoryNumber
entries(i)Message = entMessage
entries(i)Source = entSource
entries(i)EventID = entEventID
entries(i)EntryType = entEntryType
Next
End Sub
完成此函數後VB 便可以完全訪問事件日志條目了
清單 在 VB 中獲取事件日志條目
Dim eventLog As NetFrameworkWrappersEventLogWrapper
Set eventLog = New NetFrameworkWrappersEventLogWrapper
eventLogInit logName
Dim entries() As NetFrameworkWrappersEventLogEntryInfo
eventLogGetEntries entries
結論
我相信您不需要重寫現有的 VB 應用程序便可利用 NET F ramework 提供的擴展功能正如 VB Fusion 系列文章中所說的使用這些簡單的包裝類便可以通過 COM 對象提供 NET Framework 的功能該 COM 對象可以用於 VBVBAASP 或可以訪問 COM 對象的任何環境在本文中您看到了如何將功能豐富的事件日志功能添加到現有的 VB 應用程序中歡迎下載相關的示例代碼以便將事件日志添加到現在的應用程序中
Scott Swigart 傳記
Scott Swigart 從事合並技術和聚合技術的咨詢寫作和講解工作Scott 在其職業生涯中涉及的技術范圍很廣在 歲開始 Commodore 編程工作用 C++ 語言為 UNIX 系統編寫硬件診斷建立 Windows 桌面和 Web 應用程序在這些年裡Scott 涉及了組件開發XML 技術NETWeb 服務以及其他語言平台和模式由於他的這些經歷Scott 已經體會到技術是如何隨著時間而不斷發展進步的他致力於幫助組織從當今的技術中獲得最大利益同時為明天的技術做准備Scott 還是 Microsoft MVP並且是許多書籍和文章的合著者Scott 的聯系方式scott@s
From:http://tw.wingwit.com/Article/program/net/201311/13660.html