Serilog是一款以結構化紀錄的Log框架,可用於輸出檔案或存入資料庫,透過結構化的設計可以讓Logging更便利進行查詢與分析。
今天我們就重新建一個名為SerilogSample的WebAPI專案,一步一步設置並使用Serilog。
首先,先使用terminal建立一個全新專案,輸入以下指令dotnet new webapi -o SerilogSample
完畢之後cd SerilogSample
進入目錄
接著需要透過Nuget安裝Serilog的套件:dotnet add package Serilog.AspNetCore
將Program.cs
中的Main()
修改如下
public static int Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.Console()
.CreateLogger();
try
{
Log.Information("Starting web host");
CreateHostBuilder(args).Build().Run();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly");
return 1;
}
finally
{
Log.CloseAndFlush();
}
}
這邊的WriteTo.Console()設置將Log輸出到終端機的畫面上
接著在CreateHostBuilder()
中設定使用Serilog
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog() //在此加入
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
加入的位置決定啟動的順序,加在ConfigureWebHostDefaults
前可以在Host設置完成之前開始進行記錄。
第三步將appsettings.json
中的 Logging 區段移除並加入Serilog的區段
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
}
}
最後為了能更詳細的紀錄每一個Request的資訊,我們需要在Starup.Configure
中加入 app.UseSerilogRequestLogging();
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseSerilogRequestLogging(); //在這邊加入
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
設置完畢之後在目錄底下輸入dotnet run
開始運行應用程式,便可以看到輸出的Log
接著我們在WeatherForecastController的Get()這個Action中加入各等級的logging
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
_logger.LogInformation("Info!");
_logger.LogWarning("Warning!");
_logger.LogTrace("Trace!");
_logger.LogDebug("Debug");
_logger.LogCritical("Critical");
_logger.LogError("Error");
var rng = new Random();
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
加入完畢後對這個Action發出Request,可以看到我們所記錄的各等級Log
除此之外,由於剛才在Middleware有設定app.UseSerilogRequestLogging()
,所以在各等級的Log之前,可以看到Request的詳細資訊。
Seq 是一款集中Logging的服務,他提供了介面化的服務,讓開發人員可以透過Seq提供的搜尋功能,快速查找紀錄,並可以從圖表中觀察到應用程式的運行狀況。
在Windows的環境底下可以透過下載頁面進行下載及安裝Seq。
在macOS或是linux的環境上,Seq官方只提供使用Docker的方式進行安裝。
首先要透過terminal輸入docker指令docker pull datalust/seq:latest
把seq最新版的映像檔(image)抓下來
接著透過docker run --name seq -d --restart unless-stopped -e ACCEPT_EULA=Y -p 5341:80 datalust/seq:latest
啟動以Seq映像檔建立的容器。
啟動完畢後,透過瀏覽器訪問 http://localhost:5341 就可以看到成功啟動的Seq服務了。
要將Serilog的記錄寫入Seq,需要在專案底下安裝Serilog.Sinks.Seq
套件dotnet add package Serilog.Sinks.Seq
並將Program.Main
中的.WriteTo.Console()
改為.WriteTo.Seq("http://localhost:5341")
加入完畢之後可以再啟動一次專案,並訪問https://localhost:5001/WeatherForecast
就可以看到紀錄成功寫進Seq當中了