首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 寫入 Windows 系統事件日誌完整實現:EventLog 封裝類別與最佳實踐

     編輯:關於C語言

前言

Windows 事件日誌是應用程式記錄錯誤、警告、資訊的標準機制。C# System.Diagnostics.EventLog 提供完整操作 API。本文封裝可重用的 LogWriter 類別,支援自訂事件來源、日誌類型,並處理來源自動註冊。

LogWriter 完整實現

using System;
using System.Diagnostics;

namespace Log
{
    public class LogWriter
    {
        private string _eventSourceName = "test";
        private EventLogEntryType _eventLogType = EventLogEntryType.Error;

        public string EventSourceName
        {
            set => _eventSourceName = value;
        }

        public EventLogEntryType EventLogType
        {
            set => _eventLogType = value;
        }

        public void LogEvent(string message)
        {
            // 來源不存在時自動建立(需管理員權限)
            if (!EventLog.SourceExists(_eventSourceName))
            {
                EventLog.CreateEventSource(_eventSourceName, "Application");
            }

            EventLog.WriteEntry(_eventSourceName, message, _eventLogType);
        }
    }
}

使用範例

var logger = new LogWriter
{
    EventSourceName = "MyApp",
    EventLogType = EventLogEntryType.Warning
};

logger.LogEvent("資料庫連線失敗,重試中...");

關鍵技術點解析

點說明
來源註冊EventLog.CreateEventSource 需管理員權限,建議安裝程式或啟動時執行一次
日誌類型EventLogEntryType:Error、Warning、Information、SuccessAudit、FailureAudit
寫入目標預設寫入「Application」日誌,亦可指定自訂日誌名稱
遠端寫入EventLog.WriteEntry("Source", "Msg", type, 123, "RemoteMachine")
讀取日誌new EventLog("Application").Entries 列舉 EventLogEntry

最佳實踐建議

  1. 來源名稱固定:使用應用程式固定名稱(如 "MyApp.Service"),避免動態產生導致來源爆增。
  2. 安裝時註冊:在安裝程式(InstallUtil、WiX、MSI)中呼叫 CreateEventSource,運行期僅寫入。
  3. 非同步寫入:高頻日誌改用 EventLog.WriteEntryAsync (.NET 4.6+) 或批次寫入,避免阻塞主執行緒。
  4. 結構化日誌:嚴重系統建議改用 Serilog、NLog、Microsoft.Extensions.Logging 等現代框架,支援 JSON、分級、多目標輸出。
  5. 權限最小化:服務帳號僅需「寫入事件日誌」權限,不需完整管理員權限。

常見問題排查

  • System.Security.SecurityException:來源註冊需管理員,改為安裝時註冊或提升權限。
  • 日誌未出現:檢查事件檢視器篩選器、來源名稱拼寫、日誌類型是否被篩選。
  • 效能問題:頻繁寫入導致 UI 卡頓,改用非同步或緩衝機制。

總結

EventLog 是 Windows 平台原生、零依賴的日誌方案,適合簡單應用、服務、定時任務。LogWriter 封裝提供來源管理、類型選擇、自動註冊等實用功能。企業級系統建議遷移至結構化日誌框架,但理解 EventLog 基礎操作仍是 .NET 開發者必備技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved