﻿# 如何在現有 ASP.NET Core 專案加入 Seq 記錄提供者

我經常推薦 [Seq](https://datalust.co/seq) 這套記錄伺服器(Log Server)，如果要將 ASP.NET Core 的 Log 全部送到 Seq 儲存的話，其實非常簡單，因為官方的 [Seq.Extensions.Logging](https://www.nuget.org/packages/Seq.Extensions.Logging) 套件預設就支援 `Microsoft.Extensions.Logging` 的擴充，提供一個現成的 Logging Provider 讓你很方便的將 Seq 快速加入到 ASP.NET Core 之中。這篇文章我就來說說這個設定的過程。

### 設定步驟

1.  先透過 Docker 啟動一個 Seq 伺服器
    
    ```bash
    docker run --name seq -d --restart unless-stopped -e ACCEPT_EULA=Y -p 5341:80 datalust/seq:latest
    ```
    
    > 預設會監聽 `localhost:5341`
    
2.  假設我們建立一個 ASP.NET Core MVC 應用程式名為 `mvc1`
    
    ```bash
    dotnet new mvc -n mvc1
    cd mvc1
    ```
    
3.  在專案中加入 [Seq.Extensions.Logging](https://www.nuget.org/packages/Seq.Extensions.Logging) NuGet 套件
    
    ```bash
    dotnet add package Seq.Extensions.Logging
    ```
    
4.  在 `Program.cs` 加入 Seq 的 Log Provider
    
    ```csharp
    builder.Logging.AddSeq();
    ```
    
    如果要指定 Seq 伺服器位置與 API Key 的話，也可以這樣寫：
    
    ```csharp
    builder.Logging.AddSeq(serverUrl: "http://localhost:5341", apiKey: "your-api-key");
    ```
    
    如果要直接從組態進行設定，可以這樣寫：
    
    ```csharp
    builder.Logging.AddSeq(builder.Configuration.GetSection("Seq"));
    ```
    
    而 `appsettings.json` 的設定值如下：
    
    ```json
    {
      "Seq": {
        "ServerUrl": "http://localhost:5341",
        "ApiKey": "1234567890",
        "MinimumLevel": "Trace",
        "LevelOverride": {
          "Microsoft": "Warning"
        }
      }
    }
    ```
    

### 測試記錄到 Seq

1.  修改 `HomeController` 類別，加入不同 Log Level 的紀錄
    
    ```csharp
    using System.Diagnostics;
    using Microsoft.AspNetCore.Mvc;
    using mvc1.Models;
    
    namespace mvc1.Controllers;
    
    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;
    
        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }
    
        public IActionResult Index()
        {
            _logger.LogTrace("Hello, world!");
            _logger.LogDebug("Hello, world!");
            _logger.LogInformation("Hello, world!");
            _logger.LogWarning("Hello, world!");
            _logger.LogError("Hello, world!");
            _logger.LogCritical("Hello, world!");
    
            return View();
        }
    }
    ```
    
2.  調整 `appsettings.Development.json` 的 `Logging` 設定
    
    ```json
    {
      "Logging": {
        "LogLevel": {
          "Default": "Trace",
          "Microsoft.AspNetCore": "Trace"
        }
      }
    }
    ```
    
3.  啟動網站並瀏覽首頁
    
    ```bash
    dotnet run
    ```
    
4.  進入 Seq 首頁 ( [http://localhost:5341](http://localhost:5341) ) 即可看見 Log 已經被成功寫入！👍
    
    ![image](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/66b1cecab38779ca370b-90499bad-f451-49ed-a408-64b42d688b4c.webp)
    

### 相關連結

-   [Microsoft.Extensions.Logging | Seq](https://docs.datalust.co/docs/microsoft-extensions-logging)
-   [.NET 6.0 如何使用 Serilog 對應用程式事件進行結構化紀錄](/post/2021/11/29/How-to-use-Serilog-with-NET-6)
-   [Seq — centralized structured logs for . NET, Java, Node.js](https://datalust.co/seq)
-   [Screencasts | Seq](https://datalust.co/screencasts)
-   [datalust/seq - Docker Image | Docker Hub](https://hub.docker.com/r/datalust/seq)
-   [C# Logging with Serilog and Seq - Structured Logging Made Easy](https://www.youtube.com/watch?v=_iryZxv8Rxw)
