獨立使用 serilog in Asp.net Core 2.0

一般而言,我們都使用:將 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 方式達成: