使用 .NET Framework 將資訊寫入 Windows 事件記錄檔
TLDR
- 使用
EventLog.SourceExists檢查來源是否存在,若不存在則需使用EventLog.CreateEventSource進行註冊。 Source與LogName具有一對一的關聯性,一個Source只能綁定一個LogName。- 若需更改
Source所綁定的LogName,必須先刪除舊來源並建立新來源,且必須重新開機變更才會生效。 - 建立自訂記錄檔後,需重新開啟「事件檢視器」才能在介面上看到該記錄檔。
事件記錄檔的基本操作與來源註冊
在 .NET Framework 中,System.Diagnostics.EventLog 類別是處理 Windows 事件記錄的核心。操作時需注意以下兩個關鍵參數:
- Source (來源):標示應用程式名稱。
- LogName (記錄檔名稱):指定事件寫入的記錄檔分類。
什麼情況下會遇到這個問題:當應用程式初次嘗試寫入事件記錄檔,或需要將事件歸類至特定記錄檔時。
csharp
string source = "MySource";
// 檢核 Source 是否存在,不存在就建立 Source
if (!EventLog.SourceExists(source)) {
// LogName 可以寫 Application 或 應用程式,都會關聯到應用程式類別
EventLog.CreateEventSource(source, "Application");
}
// 寫入訊息
EventLog.WriteEntry(source, "MyMessage");
// 另一種寫入方式
using (EventLog log = new EventLog()) {
log.Source = source;
log.WriteEntry("MyMessage");
}


TIP
WriteEntry() 方法支援 EventLogEntryType 與 EventID 參數,可用於設定事件等級與識別碼。
自訂記錄檔名稱
若應用程式需要將記錄寫入自訂的記錄檔,可於 CreateEventSource 時指定 LogName。
什麼情況下會遇到這個問題:當開發者希望將特定應用程式的日誌與系統預設的 Application Log 分開管理時。
csharp
string source = "MySource2";
if (!EventLog.SourceExists(source)) {
EventLog.CreateEventSource(source, "MyLogName");
}
EventLog.WriteEntry(source, "MyMessage");
WARNING
建立新的自訂記錄檔後,必須重新開啟「事件檢視器」才能在介面上看到該記錄檔。
變更 Source 與 LogName 的關聯限制
若嘗試更改已存在的 Source 所綁定的 LogName,僅透過程式碼刪除並重建來源是不夠的。
什麼情況下會遇到這個問題:當應用程式架構調整,需要將既有的事件來源遷移至不同的記錄檔時。
csharp
string source = "MySource";
string logName = "MyLogName";
if (EventLog.SourceExists(source)) {
string oldLogName = EventLog.LogNameFromSourceName(source, ".");
if (oldLogName != logName) {
EventLog.DeleteEventSource(source);
EventLog.CreateEventSource(source, logName);
}
} else {
EventLog.CreateEventSource(source, logName);
}
EventLog.WriteEntry(source, "MyMessage");WARNING
根據 MSDN 文件說明,若來源已對應至記錄檔,重新對應後必須重新開機電腦,變更才會生效。否則訊息仍會寫入舊的記錄檔中。
參考資料
異動歷程
- 2023-08-04 初版文件建立。
