0%

[DotnetCore]Exception攔截神器-Elmah

前情提要

我們撰寫程式後,追縱執行狀況或Error會使用logging完成,基本上筆者平常使用Nlog來追縱執行狀況。基本上依照Log Level來區分是否使用文字檔案或資料庫形式來存放。最近遇到的情況是因為筆者目前在金融業就職,因有主管機關單位在管理,進而系統上線有一套標準,基本上開發單位不得接觸正式資料庫,文字檔案則需要申請後才能進入正式環境觀看,使得追縱實際問題,變得困難。這時候,曙光出現了:

ELMAH-Home

官方並沒有升級到dotnet core版本,還好強者貢獻dotnet core版本,參考

ElmahCore/ElmahCore

內容

建立demo API專案

筆者就用dotnet指令來建立API專案

1
2
3
4
5
mkdir ElmahDemo
cd ElmahDemo
dotnet new webapi -n ElmahDemo.API
dotnet new sln -n ElmahDemo
dotnet sln ElmahDemo.sln add ElmahDemo.API\ElmahDemo.API.csproj

安裝Nuget套件

使用Visual Studio 2019開啟sln檔案,接著安裝nuget套件,筆者這邊會採用SqlServer來當作Persistent選擇,必須安裝兩個套件,如下:

  • ElmahCore
  • ElmahCore.Sql

Startup中設定使用Elmah

appsettings.Development.json 中設定資料庫連線字串

1
2
3
"ConnectionStrings": {
"Elmah": "Data Source=.;Initial Catalog=ElmahDemo;Persist Security Info=True;Integrated Security=True;"
}

建立資料表語法參考

接著開始在Startup.cs中宣告設定及使用Elmah

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// ConfigureServices
services.AddElmah<SqlErrorLog>(opt =>
{
opt.ConnectionString = Configuration.GetConnectionString("Elmah");
});
// 需要設定以下步驟,Elmah的版面才正常
// 參考 https://github.com/ElmahCore/ElmahCore/issues/47
services.Configure<IISServerOptions>(options =>
{
options.AllowSynchronousIO = true;
});

// Configure
app.UseElmah();

觀看結果

首先筆者這邊模擬丟出Exception,撰寫一個DemoController並主動丟一個Exception出來

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using Microsoft.AspNetCore.Mvc;
using System;

namespace ElmahDemo.API.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class DemoController : ControllerBase
{
[HttpGet("elmah")]
public IActionResult Elmah()
{
throw new Exception();
}
}
}

因為設計成get,只要在瀏覽器上面 https://localhost:44330/api/demo/elmah ,即可產生Exception。接著看結果,連上elmah頁面 https://localhost:44330/elmah

看到清楚的Exception敘述,解bug所向無敵了。

結論

基本上Log套件有百百種,以圖形化介面瀏覽log,就屬elmah了。當然筆者也要在這裡埋一下伏筆,若有諸多個伺服器上運行著各式各樣的應用程式,Log蒐集是一門學問,若以者種圖形化介面的elmah,需要看各種應用程式的log則必須得切換到不同的域名中觀看,文字Log就更不用說了,需要登入到所屬伺服器及應用程式資料夾中觀看,會發現查Log會是一個多麼麻煩的事,若能有一個集中地方觀看各式各樣應用程式的Log會是一個很好的體驗,筆者會再來寫一篇關於集中log的文章,敬請期待。

參考

https://github.com/ElmahCore/ElmahCore

https://github.com/ElmahCore/ElmahCore/issues/47

https://blog.developer.money/it-鐵人賽-asp-net-core-與-log-紀錄和追蹤的愛恨交織-day-05-elmah-02-42e9b8810419