保持優質文件是 Serilog 的優先事項。如果你發現文件中有缺失或不準確的內容,或者希望透過新增主題或教程來擴充套件 wiki,請透過問題追蹤系統告知我們。
為什麼選擇Serilog?
與許多其他 .NET 庫一樣,Serilog 提供了基本的診斷日誌記錄功能,支援檔案、控制檯等多種方式。它易於設定,具有簡潔的 API,並且可以在最新的 .NET 平臺之間移植。
與其他 .NET 日誌庫不同,Serilog 傳遞的引數不會被破壞性地轉換為文字格式。相反,它們會作為結構化資料被保留,可以以文件形式寫入 NoSQL 資料儲存中。
var input = new { Latitude = 25, Longitude = 134 }; var time = 34; log.Information("Processed {@SensorInput} in {TimeMS:000} ms", input, time);
Serilog 訊息模板使用一種簡單的領域特定語言(DSL),擴充套件了常規 .NET 格式字串。屬性在訊息模板中命名,並與提供給日誌方法的引數按位置匹配。
這個示例記錄了兩個屬性:SensorInput 和 TimeMS,以及日誌事件。
在 JSON 格式中,示例中捕獲的屬性將如下所示:
{ "SensorInput": { "Latitude": 25, "Longitude": 134 }, "TimeMS": 34 }
在 SensorInput 前面的 @ 運算子指示 Serilog 保留傳入物件的結構。如果省略這個運算子,Serilog 會識別簡單型別,如字串、數字、日期和時間、字典以及可列舉型別;其他物件會使用 ToString() 方法轉換為字串。可以使用 $ 運算子強制進行字串化,代替 @ 運算子。
TimeMS 後面的 :000 部分是標準 .NET 格式字串,影響屬性的呈現方式(而不是捕獲方式)。Serilog 附帶的標準控制檯接收器將把上述訊息呈現為:
09:14:22 [Information] Processed { Latitude: 25, Longitude: 134 } in 034 ms
從 NuGet 安裝
核心日誌記錄包是 Serilog。支援的平臺包括 .NET/.NET Core、.NET Framework 4.5+、Windows(8/WinRT/Universal+)和 Windows Phone 8+。
$ dotnet add package Serilog
$ dotnet add package Serilog.Sinks.Console
瀏覽 NuGet 上的 Serilog 標籤,檢視可用的 sinks、擴充套件和相關的第三方包。
型別位於 Serilog 名稱空間。
using Serilog;
透過 LoggerConfiguration 建立根日誌記錄器。
using var log = new LoggerConfiguration() .WriteTo.Console() .CreateLogger();
這通常在應用程式啟動時完成,並將日誌記錄器儲存以供應用程式類後續使用。如果需要,可以建立和獨立使用多個日誌記錄器。
log.Information("Hello, Serilog!");
Serilog 的全域性、靜態可訪問日誌記錄器透過 Log.Logger 設定,可以使用 Log 類上的靜態方法呼叫。
Log.Logger = log; Log.Information("The global logger has been configured");
配置和使用 Log 類是一種可選的便利性,方便庫採用 Serilog。Serilog 本身的日誌記錄管道不要求任何靜態/程序範圍的狀態,因此直接使用 Logger/ILogger 也是可以的。
示例應用程式
下面的完整示例展示了在一個簡單的控制檯應用程式中進行日誌記錄,事件會傳送到控制檯以及帶有日期戳的滾動日誌檔案。
1.建立一個新的控制檯應用程式專案
2.安裝核心 Serilog 包、控制檯接收器(sink)和檔案接收器(sink)
在專案目錄中的 shell 提示符下,輸入:
$ dotnet add package Serilog
$ dotnet add package Serilog.Sinks.Console
$ dotnet add package Serilog.Sinks.File
3.在 Program.cs 中新增以下程式碼
using System; using Serilog; class Program { static async Task Main() { Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.Console() .WriteTo.File("logs/myapp.txt", rollingInterval: RollingInterval.Day) .CreateLogger(); Log.Information("Hello, world!"); int a = 10, b = 0; try { Log.Debug("Dividing {A} by {B}", a, b); Console.WriteLine(a / b); } catch (Exception ex) { Log.Error(ex, "Something went wrong"); } finally { await Log.CloseAndFlushAsync(); } } }
4.執行程式