筆記目錄

Skip to content

使用 .NET Framework 將資訊寫入 Windows 事件記錄檔

TLDR

  • 使用 EventLog.SourceExists 檢查來源是否存在,若不存在則需使用 EventLog.CreateEventSource 進行註冊。
  • SourceLogName 具有一對一的關聯性,一個 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");
}

eventlog source propertyeventlog logname propertyevent viewer application log

TIP

WriteEntry() 方法支援 EventLogEntryTypeEventID 參數,可用於設定事件等級與識別碼。

自訂記錄檔名稱

若應用程式需要將記錄寫入自訂的記錄檔,可於 CreateEventSource 時指定 LogName

什麼情況下會遇到這個問題:當開發者希望將特定應用程式的日誌與系統預設的 Application Log 分開管理時。

csharp
string source = "MySource2";

if (!EventLog.SourceExists(source)) {
    EventLog.CreateEventSource(source, "MyLogName");
}

EventLog.WriteEntry(source, "MyMessage");

event viewer custom log

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 初版文件建立。