文章三:Mastering Serilog in .NET: The Complete Guide (2025 Edition)
這是一篇關於在 .NET 環境中實作 Serilog 的權威指南,涵蓋了從安裝、配置到進階應用的所有面向。
1. 什麼是 Serilog 及其優勢 (What is Serilog & Why Use It?)
- 原文重點:Serilog 是 .NET 的結構化日誌庫。與僅存儲純文字的傳統記錄器不同,Serilog 捕捉結構化數據(鍵值對)。
- 範例:
Log.Information("User {UserId} placed order {OrderId}", 123, 456);內部存儲為 JSON:{"UserId": 123, "OrderId": 456, "Message": "..."}
- 範例:
- 段落總結:結構化日誌讓數據在 Seq、Elasticsearch 或 Splunk 等平台中更容易被查詢與過濾。Serilog 的優勢在於其廣泛的生態系統、易於與 .NET Core
ILogger整合、強大的豐富化(Enrichment)功能以及對雲端/微服務的良好支援。
2. 安裝與配置 (Installing & Configuring)
- 原文重點:
- 安裝套件:
dotnet add package Serilog.AspNetCore,Serilog.Sinks.File等。 - appsettings.json 配置:
"Serilog": { "WriteTo": [ { "Name": "Console" }, { "Name": "File", "Args": { "path": "Logs/log-.txt", "rollingInterval": "Day" } } ] } - Program.cs 註冊:
builder.Host.UseSerilog(); // Register Serilog var app = builder.Build(); app.UseSerilogRequestLogging(); // Enable request logging
- 安裝套件:
- 段落總結:配置分為兩部分:在
appsettings.json定義 Sinks(輸出目標)和過濾規則,以及在Program.cs初始化並替換預設的 Logging Provider。特別注意UseSerilogRequestLogging()對於精簡 HTTP 請求日誌的重要性。
3. 結構化日誌與物件記錄 (Structured & Object Logging)
- 原文重點:使用
@運算符來記錄完整物件。- 範例:
var order = new { Id = 123, Total = 500 }; Log.Information("Order received {@Order}", order);
- 範例:
- 段落總結:透過
@解構符,Serilog 可以將複雜物件序列化為結構化欄位,這對於後續的日誌分析至關重要,避免了手動拼接字串的麻煩。
4. 異常與請求日誌 (Exception & Request Logging)
- 原文重點:
- 異常:
Log.Error(ex, "Failed to process order {OrderId}", orderId); - 自定義請求日誌:
app.UseSerilogRequestLogging(options => { options.MessageTemplate = "Handled {RequestPath}"; });
- 異常:
- 段落總結:正確的異常記錄應包含 Exception 物件本身以保留 Stack Trace。自定義請求日誌則允許開發者調整 HTTP 請求的日誌格式與層級,減少雜訊。
5. 豐富化與微服務關聯 (Enrichers & Correlation IDs)
- 原文重點:自動添加元數據。
- 配置:
.Enrich.WithMachineName().Enrich.FromLogContext() - 關聯 ID (Correlation ID):
using (LogContext.PushProperty("CorrelationId", context.TraceIdentifier)) { await _next(context); }
- 配置:
- 段落總結:Enrichers 能自動在每條日誌中附加機器名稱、ThreadId 等資訊。在微服務架構中,透過 Middleware 推送
CorrelationId是追蹤跨服務請求的關鍵實踐。
6. JSON 日誌與 Rolling File (JSON Logging & Rolling Files)
- 原文重點:這對 Docker/Kubernetes 至關重要。
- 配置:
"formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog" - Rolling:
"rollingInterval": "Day"(產生 log-2025-11-27.txt)
- 配置:
- 段落總結:為了適應雲端環境(如 ELK Stack 或 Splunk),將日誌格式化為 JSON 是標準做法。Rolling File 則確保日誌檔案按時間或大小分割,便於管理與歸檔。
結論:現代化日誌的標準
Serilog 將日誌從單純的文字訊息轉變為結構化、可查詢的數據。對於任何 .NET Core 或 .NET 8+ 的新應用程式,Serilog 應是預設的日誌框架。其強大的 Sinks 生態系統(Seq, Elasticsearch, Azure)與豐富化功能,為單體與微服務架構提供了堅實的監控與診斷基礎。