iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 17
1
Modern Web

我與 ASP.NET Core 的 30天系列 第 17

[Day17] Serilog & Seq 為你打造良好的Log管理環境- 我與 ASP.NET Core 3 的 30天

Serilog是一款以結構化紀錄的Log框架,可用於輸出檔案或存入資料庫,透過結構化的設計可以讓Logging更便利進行查詢與分析。
今天我們就重新建一個名為SerilogSample的WebAPI專案,一步一步設置並使用Serilog。
首先,先使用terminal建立一個全新專案,輸入以下指令
dotnet new webapi -o SerilogSample完畢之後cd SerilogSample進入目錄

安裝Serilog

接著需要透過Nuget安裝Serilog的套件:
dotnet add package Serilog.AspNetCore

初始化Serilog

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

https://ithelp.ithome.com.tw/upload/images/20201001/20129389eBnXdnoBOk.png

接著我們在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
https://ithelp.ithome.com.tw/upload/images/20201002/20129389ETM3KCYggn.png
除此之外,由於剛才在Middleware有設定app.UseSerilogRequestLogging(),所以在各等級的Log之前,可以看到Request的詳細資訊。

Seq 簡介

Seq 是一款集中Logging的服務,他提供了介面化的服務,讓開發人員可以透過Seq提供的搜尋功能,快速查找紀錄,並可以從圖表中觀察到應用程式的運行狀況。

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服務了。

https://ithelp.ithome.com.tw/upload/images/20201002/20129389B52YE58wk6.png

將Serilog的記錄寫進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當中了
https://ithelp.ithome.com.tw/upload/images/20201002/20129389EI9UcgxLCx.png

參考資料
Serilog
Seq
Seq-Docker Hub


上一篇
[Day16] Logging 記錄管理 - 我與 ASP.NET Core 3 的 30天
下一篇
[Day18] Views - 我與 ASP.NET Core 3 的 30天
系列文
我與 ASP.NET Core 的 30天31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言