上篇回顧:|從0到1的建立 Web API 專案|JWT 建立 + Swagger 搭配 JWT
上篇回顧:|從0到1的建立 Web API 專案|Session 設置
上篇回顧:|從0到1的建立 Web API 專案|Middleware 統一回傳格式
上篇回顧:|從0到1的建立Web API專案| Model 驗證之再進化 — FluentValidation
上篇回顧:|從0到1的建立Web API專案|AutoMapper 轉換
在執行專案時,難免會碰到錯誤或者需要紀錄的歷程,這時候總不能遇到時就手動紀錄一次,需要一些小工具來協助我們完成自動化紀錄的動作,除了記錄外還可以選擇要將這些資料記錄在哪裡,而今天介紹的 Serilog 就是一款結構化紀錄的Log框架,可以用於輸出紀錄檔案或將紀錄存入資料庫,方便查詢與分析。以下會示範 Serilog 如何寫入檔案與資料庫,並結合 Seq 在網頁上呈現紀錄。在使用 Serilog 前,請先在 NuGet 裡下載組件 Serilog 與 Serilog.AspNetCore(圖一)。
以下會分成三部分來說明,包括寫入檔案、寫進資料庫、呈現在網頁(結合Seq)(點擊直接跳到該段落)。
先嘗試使用 Serilog 將紀錄寫在檔案內,在 appsettings.json 內建立一個 Serilog 的 json 字串,並放入以下內:
(1) MinimumLevel:放入想要紀錄的最小階層。
(2) WriteTo : 內容放置想要使用的功能(Console/File/MSSqlServer…等)。
(3) Name : 功能名稱。
(4) Args : 依照不同功能放入不同參數(後續會示範到功能的參數內容)。
而我們現在要使用File,將記錄寫至檔案內,需要在 NuGet 裡下載組件Serilog.Sinks.File(圖二),並在 json 內寫入路徑(Path)與定義區方檔名的方式(rollingInterval,這邊以當日日期來做區分,其餘細項請參考下方文件一)。
定義好 Serilog 的 json 後要在 Program.cs 呼叫 Serilog 請它自動記錄錯誤與資訊,設定最小階層為 Info 且抓取 appsettings.json 的 Serilog 內容,寫兩個測試Log(Information、Error)後,在 CreateHostBuilder 中將專案內建的 Logging 與 Serilog 結合,這可以讓等等在 Controller 呼叫時方便許多,執行專案後讓來看看在專案內產生的檔案(圖三)。
接下來來試看看將記錄寫進指定資料表內,同上一樣需要在 NuGet 裡下載組件 Serilog.Sinks.MSSqlServer (圖四),並在 appsettings.json 內寫入資料庫連線資料與資料表資訊(這邊範例使用SqlServer)。
Serilog 有提供制式的 LogTable SQL 語法,參考如下。Serilog 也提供自定義欄位的方法可以在 appsettings.json 中設定,依照自己的使用習慣來做增減,在 additionalColumns 中放入想要自定義新增的欄位內容與型別,也可以使用 removeStandardColumns 刪除原本制式的欄位,而這些欄位變動會在啟動專案時,自動寫入資料庫內。
使用 appsettings.json 的好處就是可以統一處理 Serilog 現在所有有使用的套件設定,不需要在 Program.cs 另外做任何設定,就可以直接執行專案看看剛寫的測試紀錄有沒有出現在資料表中(圖五)。那我們剛剛自定義的欄位要怎麼將資料放入資料庫呢?在 Program.cs 中的 LoggerConfiguration 設置一個全局的 Property,在相同的 LoggerConfiguration 下面每次紀錄都可以共用,接下來再次執行專案,看看我們自定義的欄位有沒有在資料表裡(圖六)。
在來我們可以嘗試將 Controller 內的函式用 Serilog 記錄,前面有提到說我們已經將專案內建的 Logging 與 Serilog 結合,所以我們在 Controller 內只需要注入 Logging 後即可使用,我們在GetProduct函式中使用兩種方式紀錄(success1 直接呼叫 Serilog / success2 用結合 Serilog 的 Logging 紀錄),接下來執行專案並呼叫 GetProduct 看看能不能在檔案與資料表中看到紀錄(圖七與圖八)。
Serilog 也可以與 Seq 搭配,在 Seq 上看到 Serilog 的紀錄,而 Seq 是什麼?Seq 是一款收集與集中 Logging 的服務,提供介面化的服務,可以透過 Seq 提供的搜尋功能,快速查找紀錄,也可以從圖表中觀察到現行的運行狀況。在 Windows 的環境下可以從網址進行安裝,但 macOS 或是 Linux 目前就只能使用 Docker 進行安裝。
在終端機內輸入 Docker 指令 docker pull datalust/seq:latest (圖八),就可以在 Docker UI 上看到安裝好的映像檔(image)(圖九),接著繼續輸入 docker run — name seq -d — restart unless-stopped -e ACCEPT_EULA=Y -p 5341:80 datalust/seq:latest,就可以啟用Seq映像檔建立的容器,啟動完畢後我們要將 Seq 與專案的 Serilog 進行結合。
同上一樣需要在 NuGet 裡下載組件 Serilog.Sinks.Seq (圖十),並且在Program.cs 內加入我們想要訪問的指定網域,就可以執行專案並開啟瀏覽器訪問剛剛的指定網域,我們就會看到 Seq 的畫面 (圖十一),可以發現我們剛剛的紀錄都被寫在 Seq 上了。
Serilog 的應用就在這邊告一段落,其實 Serilog 還有非常多靈活的組件可以使用,搭配的 Seq也有許多不同的圖表與進階的搜尋可以變化,但在這邊我們就先介紹完基礎應用,我們下次見~