Serilog 配置基礎知識


【譯】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 實例。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM