Windows事件日志
Windows 操作系統將與計算機的系統性能、應用程序和安全方面相關的每個事件記錄在 C:\WINDOWS\system32\winevt 的日志中。
事件查看器從這些原始事件日志中讀取信息,然后以可讀格式呈現信息。
打開Windows事件查看器的方法:
1、運行輸入eventvwr
2、Windows+X打開的超級菜單中選擇事件查看器。
3、桌面計算機圖標右鍵選擇【管理】,在計算機管理中打開【事件查看器】
事件查看器打開后顯示如下:
有三個默認事件日志:應用程序、系統和安全。 安全日志(只讀的)。
注意:事件是跟注冊表關聯起來的,所以推薦以管理員權限運行,否則有些類別下的日志無法讀取/寫入/刪除。
像平常我們開發的程序如果想更方便的查找錯誤,除了本地日志外,還可以將日志寫入到Windows事件日志中的【應用程序和服務日志】類別下,可以方便我們快速查找問題。
EventLog類
在C#中操作Windows事件日志主要使用EventLog類,EventLog類內部使用了ReadEventLogW/ReportEventW等win32 api函數。
在.Net Framework中,直接使用System.Diagnostics.EventLog類即可,
在.NET Core項目中,需要引用System.Diagnostics.EventLog包
EventLog類提供了實例化版本的方法和靜態方法兩種,類似FileInfo和FIle類。
本文以EventLog類的靜態方法進行演示。
獲取日志名字
var logs = EventLog.GetEventLogs();
foreach (var item in logs)
{
Console.WriteLine(item.LogDisplayName + $"[{item.Log}]");
}
運行輸出如下
獲取日志下的單個記錄
這里我們以Visual Studio日志為例,輸出Visual Studio日志下的所有記錄。
static void Main(string[] args)
{
PrintLogClass();
PrintLogEntry("Visual Studio");
}
static void PrintLogEntry(string logName)
{
var logs = EventLog.GetEventLogs();
foreach (var item in logs)
{
if(item.LogDisplayName == logName)
{
foreach (EventLogEntry entry in item.Entries)
{
Console.WriteLine($"級別:{entry.EntryType}");
Console.WriteLine($"創建時間:{entry.TimeGenerated}");
Console.WriteLine($"來源:{entry.Source}");
Console.WriteLine($"事件ID:{entry.InstanceId}");
Console.WriteLine($"日志內容:{entry.Message}");
Console.WriteLine();
}
}
}
}
運行結果如下:
創建日志
寫入記錄到系統日志下
這里以【應用程序】日志為例,操作如下:
if(!EventLog.SourceExists("MyApplicationLogSource"))
{
EventLog.CreateEventSource("MyApplicationLogSource", "Application");
}
EventLog.WriteEntry("MyApplicationLogSource", "測試日志內容",EventLogEntryType.Warning,100010);
運行后到事件查看器查看寫入的日志
寫入記錄到自定義日志類別下
if (!EventLog.SourceExists("MySource"))
{
EventLog.CreateEventSource("MySource", "MyLog");
}
EventLog.WriteEntry("MySource", "你可以指定日志內容", EventLogEntryType.Warning, 10010);
運行后,可以看到增加了一個MyLog日志,并增加了一條類型為警告的記錄
清除日志下的所有記錄
var logs = EventLog.GetEventLogs();
foreach (var item in logs)
{
if (item.LogDisplayName == logName)
{
item.Clear();
break;
}
}
刪除日志
EventLog.DeleteEventSource("MySource");
EventLog.Delete("MyLog");
示例代碼
附件:EventvwrMgmtDemo.zip
閱讀原文:原文鏈接
該文章在 2025/6/23 14:18:30 編輯過