[HowTo] 實作 Line Notify 通報系統異常,ASP.NET Core 3.1 搭配 NLog

阿蘇卡
Nov 16, 2020

--

Photo by RetroSupply on Unsplash

上一篇中介紹了 Line Notify 服務註冊與 API 呼叫方式,此篇文章要實際運用於 ASP.NET Core 3.1 專案,搭配 NLog 日誌記錄工具。

會選擇 NLog ,主要是 NLog 可以同時啟用多種紀錄方式;每種紀錄方式可定義在何種 log 類型發生時啟動。log 類型分為五種等級,嚴重性由重至輕排序如下:

因此可以設定為:
當系統發生嚴重狀況時(Error 或 Fatal) 使用 Line Notify 即時通知,
其他則寫入檔案,有需要再自行查看。

實作

1. 在 ASP.NET Core 專案中安裝 NLog 套件:

NLog
NLog.Web.AspNetCore

2. 修改 Program.cs,注入 NLog 服務:

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseNLog(); // NLog: Setup NLog for Dependency injection

3. 引用 askaLib.Line.Notify 專案,修改 Starup.cs 注入服務:

4. 新增一個 NLog target,負責發送 Line Notify 訊息:

Target 是 NLog 負責處理事件的物件,除了像本篇建立新項目外,
NLog 內建多種類型,可以直接使用,例如:
ConsoleFileDatabase
完整支援清單請見 https://nlog-project.org/config/

實作時只需覆寫 Write 函式,我將取得 user token 來源的處理方式獨立為函式,後續可以視需求改寫,例如:從 DB 查詢。

5. 回到 Startup.cs,在注入 LineNotifyService 後,可以在 Configure 函式取得實體,也就是修改為:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, LineNotifyService service)
{
...略...
}

將剛剛新增的 target 註冊至 NLog:

NLog.LogManager.Setup()
.SetupExtensions(s =>
s.RegisterTarget<LineNotifyTargetWithLayout>(
typeof(LineNotifyTargetWithLayout).Name
));

實體化 LineNotifyTargetWithLayout 時需指定 layout,也就是紀錄內容格式。

LineNotifyTargetWithLayout LineNotifyTarget = 
new LineNotifyTargetWithLayout(service)
{
Layout = @"[${date:yyyy-MM-dd HH\:mm\:ss} ${level:upperCase=true}]
MESSAGE=${message}
---------------------------
STACKTRACE=at ${callsite} in ${callsite-filename}:line ${callsite-linenumber}"
};

layout 格式參數可參考

最後,使用實體化的 target 並指定 log 紀錄類型,指定為 NLog Configuration:

LoggingConfiguration config = new   
NLog.Config.LoggingConfiguration();
config.AddRule(NLog.LogLevel.Error, NLog.LogLevel.Fatal,
LineNotifyTarget);
NLog.LogManager.Configuration = config;

最後,就是等待接收訊息囉 (或是期待不要發生錯誤訊息 ><)

完整程式碼:

以上內容希望對各位有幫助

--

--

阿蘇卡
阿蘇卡

Written by 阿蘇卡

後端工程師。記錄下自己開發路上踩過的坑、研究過後的心得,希望對自己好,對其他工程師也好~

No responses yet