一般而言,我們都使用:將 Serilog 加入到預設的 LOG 中:
loggerFactory.AddSerilog();
但這裡會有一點點麻煩的是 Asp.net Core內建的 Ilogger 會自動記錄系統執行狀況,造成 log 訊息過多,反而不方便分析。
如果只想要將明確指定的LOG記錄在檔案內,不是透過 information 等設定,也不想要內建的複雜訊息,可以透過分開設定 Serilog 透過 Rolling File 記錄我們想要的訊息:
首先,在 Program.cs 中,設定 ConfigureAppConfiguration如下(也可以直接在 Startup.cs 中的 constructor 中設定,但因為這些是屬於基本設定,我們不希望讓 startup 複雜化,因此在這裡就直接設定好)
Log.Logger = new LoggerConfiguration() .WriteTo.RollingFile(@"logs\log-{Date}.txt", outputTemplate: "{Timestamp:HH:mm:ss} [{SourceContext}][{Level}]{Message}{NewLine}") .CreateLogger();
這裡重點在於 Log.Logger 透過用 Serilog 的 Configuration 建立的 Logger 參數,我們設定了許多的訊息表達方式。
其次,在 Startup.cs 中,利用 Singleton 將此 Log.Logger 利用 dependency Injection 提供給需要使用的 class:
services.AddSingleton(Log.Logger);
這裡必須要指定 Serilog.ILogger 否則會跟內建的 ILogger interface 混淆。
同樣的,要使用的 class 也要透過 injection 使用:
public class ContactModel : PageModel { public string Message { get; set; } private readonly Serilog.ILogger _logger; public ContactModel(Serilog.ILogger logger) { _logger = logger.ForContext<ContactModel>(); } }
其中,指定 ForContext 會搭配 {SourceContext} 顯示在 log 檔案中。
如果要將內建的 log 訊息寫入到 Serilog 中(或者簡單說用 serilog 取代內建的 Extension.ILogger ),可以用:
1. 引用 nuget package: Serilog.Extensions.Logging
2. 在 Startup.ConfigureServices 中,使用 AddSerilog 方式達成: