【譯】Serilog 配置基礎知識
Serilog 使用簡單的C# API來配置日志記錄。當外部配置需要時,可以使用Serilog.Settings.AppSettings包(.NET 框架)或Serilog.Settings.Configuration(.NET Core) 謹慎混合。
本文目錄:
- 創建記錄器
- 接收器
- 輸出模板
- 最低級別
- 覆蓋接收器
- 擴充器
- 過濾器
- 子記錄器
創建記錄器
使用 LoggerConfiguration
對象創建記錄器:
Log.Logger = new LoggerConfiguration().CreateLogger(); Log.Information("No one listens to me!");
上面的示例將創建一個記錄器,該記錄器不會在任何地方記錄事件。要查看日志事件,必須配置接收器。
接收器
日志事件接收器通常將日志事件記錄到某些外部表示形式,通常是控制台、文件或數據存儲。Serilog 接收器通過 NuGet 分發。維基上列出了一個精選的可用接收器列表。
此示例將使用控制台接收器包(它漂亮地打印日志數據)和文件接收器包,后者將日志事件寫入一組含有日期戳的文本文件。
Install-Package Serilog.Sinks.Console Install-Package Serilog.Sinks.File
使用 WriteTo
對象配置接收器。
Log.Logger = new LoggerConfiguration() .WriteTo.Console() .CreateLogger(); Log.Information("Ah, there you are!");
多個接收器可以同時處於活動狀態。添加額外的接收器非常簡單,就像鏈接 WriteTo
塊一樣:
Log.Logger = new LoggerConfiguration() .WriteTo.Console() .WriteTo.File("log-.txt", rollingInterval: RollingInterval.Day) .CreateLogger();
輸出模板
基於文本的接收器使用輸出模板來控制格式設置。這可以通過 outputTemplate
參數進行修改:
.WriteTo.File("log.txt", outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}")
如上例所示,默認模板使用內置屬性,如 Timestamp
和 Level
。來自事件的屬性(包括使用擴充器附加的屬性)也可以顯示在輸出模板中。
{Message:lj}
格式選項使消息中嵌入的數據輸出在 JSON(j)中,但字符串文本除外,這些文本是原樣輸出的。
對於更緊湊的級別名稱,分別使用 {Level:u3}
三個字符大寫或 {Level:w3}
小寫作為級別名稱的格式。
添加 {Properties:j}
到輸出模板以包括其他上下文信息。
最低級別
Serilog 實現了日志事件處理的"最低級別"這一常見概念。
Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.Console() .CreateLogger();
MinimumLevelDebug
對象提供要指定為最小值的日志事件級別之一。在上面的示例中,將處理 Debug
級別和更高級別的日志事件,並最終寫入控制台。
級別 | 用法 |
---|---|
Verbose | 詳細級別是最嘈雜的級別,很少(如果有的話)為生產應用啟用。 |
Debug | 調試級別用於內部系統事件,這些事件不一定可以從外部觀察到,但在確定發生情況時非常有用。 |
Information | 信息級別事件描述系統中發生的與其職責和功能相對應的事情。通常,這些是系統可以執行的可觀察操作。 |
Warning | 當服務降級、危及或可能超出其預期參數時,將使用警告級別事件。 |
Error | 當功能不可用或預期中斷時,將使用錯誤事件。 |
Fatal | 最關鍵的級別,致命事件需要立即關注。 |
默認級別- 如果沒有指定 MinimumLevel
,則將處理 Information
級別事件和更高級別的事件。
覆蓋接收器
有時,最好將詳細日志寫入一種介質,但將不太詳細的日志寫入另一種介質。
Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.File("log.txt") .WriteTo.Console(restrictedToMinimumLevel: LogEventLevel.Information) .CreateLogger();
在此示例中,調試日志將寫入滾動文件,而只有 Information
級別日志和更高級別的日志將寫入控制台。
所有提供的接收器都支持配置 restrictedToMinimumLevel
參數。
記錄器與接收器最小值- 必須認識到,日志記錄級別只能針對接收器升高,不能降低。因此,如果記錄器 MinimumLevel
設置為 Information
,則以 Debug
為指定級別的接收器仍將看到 Information
級別事件。這是因為記錄器級配置控制哪些日志記錄語句將導致事件創建,而接收器級配置僅篩選這些事件。要創建具有更詳細級別的單個記錄器,請使用單獨的 LoggerConfiguration
。
擴充器
Enrichers
是添加、刪除或修改附加到日志事件的屬性的簡單組件。例如,這可用於將線程 ID 附加到每個事件。
class ThreadIdEnricher : ILogEventEnricher { public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory) { logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty( "ThreadId", Thread.CurrentThread.ManagedThreadId)); } }
使用 Enrich
配置對象添加擴充器。
Log.Logger = new LoggerConfiguration() .Enrich.With(new ThreadIdEnricher()) .WriteTo.Console( outputTemplate: "{Timestamp:HH:mm} [{Level}] ({ThreadId}) {Message}{NewLine}{Exception}") .CreateLogger();
上面的配置顯示了如何在輸出格式中使用由擴充器添加的屬性。
如果擴充的屬性值在整個應用程序運行過程中是不變的,則 WithProperty
快捷方法可用於簡化配置。
Log.Logger = new LoggerConfiguration() .Enrich.WithProperty("Version", "1.0.0") .WriteTo.Console() .CreateLogger();
對於使用結構化存儲的接收器,可以查看和篩選屬性值,則擴充器及其附加的屬性通常更有用。
過濾器
可以通過篩選有選擇地記錄事件。過濾器只是 LogEvent
上的謂詞,一些常見的場景由匹配類處理。
Log.Logger = new LoggerConfiguration() .WriteTo.Console() .Filter.ByExcluding(Matching.WithProperty<int>("Count", p => p < 10)) .CreateLogger();
子記錄器
有時,對接收器看到的內容進行更精細的控制是必要的。為此,Serilog
允許完整的日志記錄管道充當接收器。
Log.Logger = new LoggerConfiguration() .WriteTo.Console() .WriteTo.Logger(lc => lc .Filter.ByIncludingOnly(...) .WriteTo.File("log.txt")) .CreateLogger();
對於子記錄器處理不合適的場景,可以創建多個獨立的頂級管道。只能將一個管道分配給 Log.Logger
,但應用可以使用所需的其他 ILogger
實例。