Skip to main content

Command Palette

Search for a command to run...

[IT 鐵人賽] ASP.NET Core 與 Log 紀錄和追蹤的愛恨交織 - Day 05 - Elmah - 02

Updated
2 min read
[IT 鐵人賽] ASP.NET Core 與 Log 紀錄和追蹤的愛恨交織 - Day 05 - Elmah - 02

.NET Core Logging- Elmah 02

上一篇我們提到了基本的使用方式,接下來的這一篇我們就來講講要怎麼把 Log 放到不同的儲存體上,以及如何過濾 Log


Log 儲存方式

我們先來看這些 Log 倒底存在哪裡,目前共有三種儲存方式,如下:

  • MemoryErrorLog — store errors in memory 預設為使用此方式,簡單來說就是將錯誤 Log 都存在記憶體裡,所以只要應用程式一重新啟動,Log 就沒了;但是也是最方便的方式,只是要注意如果 Log 太多的話,記憶體的使用狀況,避免記憶體不足的情況。
  • XmlFileErrorLog — store errors in XML files 將 Log 存成 Xml 格式之檔案,並儲存於檔案系統上。
  • SqlErrorLog — store errors in MS SQL 將 Log 存到 SQL Server 上。

https://github.com/funky81/ElmahCore 有額外提供 Redis 當作儲存體


如果要使用除了 MemoryErrorLog 以外的方式,下面一一介紹如何設定

XmlFileErrorLog

Startup.csConfigureServices 中加入 service.AddElmah(); 時,使用泛型來指定要儲存的方式,並指定儲存路徑

這樣就會將錯誤 Log 存成 Xml 格式,並放在指定目錄;以此為例就是在應用程式根目錄底下的 logs 資料夾,也可以直接指定絕對路徑,例如:D:\ErrorLogs

要注意的是每一個錯誤 Log 就是一個 Xml 檔案,所以有可能會塞爆檔案系統,或是檔案數量過多,導致系統效能低下

SqlErrorLog

Startup.csConfigureServices 中加入 service.AddElmah(); 時,使用泛型來指定要儲存的方式,並指定連線字串

"ConnectionStrings": {
    "ElmahConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Elmah;Trusted_Connection=True;MultipleActiveResultSets=true"
}

需要先根據 https://bitbucket.org/project-elmah/main/downloads/ELMAH-1.2-db-SQLServer.sql 建立資料表

這樣即可建立並使用資料庫收集錯誤 Log


使用 Filter

Elmah 預設會記錄所有例外錯誤,但是有些可能是很常見或是不需要理會的 Log,例如 HTTP 404 找不到資源錯誤,而且這種情況可能很多,導致產生大量無用 Log;因此可以透過 Filter 的方式過濾

這部分基本上與 Elmah 差不多相同,有兩種方式可以進行設定:

  1. 透過程式動態設定

透過實作 IErrorFilter 介面,當 Filtering 事件發生時,它會去看說是不是有任何的 Filter呼叫 Dismiss 方法,呼叫 Dismiss 方法代表 Elmah 會略過此 Log

以下面程式碼為例:實作當遇到 NotImplementedException 時就不會記錄 Log,並於 Startup.csConfigureServices 加入 service.AddElmah(); 時,加入相關設定

  1. 透過 XML 設定檔

Elmah 可以讀取 XML 設定檔來進行 Filter 設定,這樣就不用每當需要修改不同條件時還需要修改程式

以下面為例,於設定檔中設定不要紀錄 HTTP 404 的 Log ,並於 Startup.csConfigureServices 加入 service.AddElmah(); 時,加入相關設定

上面的 elmah.xml 需要實作 errorFilter 區段

test 代表的是要判斷是否相符,若相符則略過,底下有不同的運算子: equallessergreaterandor 等等

<test>
  <and>
      <greater binding="HttpStatusCode" value="399" type="Int32" />
      <lesser binding="HttpStatusCode" value="500" type="Int32" />
  </and>
</test>

以上面為例,就是要略過 HTTP 狀態碼大於 399 且小於 500 的所有錯誤 Log

詳細設定說明請參考:https://elmah.github.io/a/error-filtering/


傳送通知

在正式環境發生嚴重例外時,除了記錄下來以外,最好也要可以及時通知相關人員,Elmah 也透過寄送 Email 的方式提供了基本的通知功能

直接在 Startup.csConfigureServices 加入 service.AddElmah(); 時,加入相關設定

每個 ErrorMailNotifier 實體都必須要有唯一的名字EmailOptions 就是一些關於 Mail Server 與寄送相關資訊的設定,所以這邊就不再多詳談


下一篇來介紹 Elmah 的雲端變種:Elmah.io

More from this blog

Career-Ops 安裝與設定 — 用 AI 來幫你篩職缺、客製履歷

最近在看新的工作機會,光是瀏覽職缺、比對 JD、調整履歷就花了不少時間。 後來找到 Career-Ops 這個開源專案 作者 santifer 用這套系統篩了 740 多個職缺、產出 100 多份客製化履歷,最後拿到 Head of Applied AI 的 offer。 看起來蠻有意思的,所以我就在 Windows 上實際裝了一輪,這篇就來把整個安裝和設定的過程記錄下來。 我這邊搭配的 AI 後

Apr 12, 20265 min read
Career-Ops 安裝與設定 — 用 AI 來幫你篩職缺、客製履歷

讓 LLM 自動化你的 N8N 工作流程:n8n-mcp-server 安裝指南

前言 網路上一大堆都是在介紹如何在 N8N 裡面用 MCP 來呼叫其他工具,但是更多時候我希望 LLM 能直接幫我寫好或是修改 N8N 的工作流程 所以這篇就來介紹如何設定與使用 n8n-mcp-server 來讓 LLM 幫忙操控 N8N 在 GitHub 上有不少的 n8n-mcp-server,經過一下下的簡單搜索,我決定使用這個專案: n8n-mcp-server 原因在於說這個專案的實作提供了基本上所有需要編輯工作流程的功能,以下就來記錄安裝過程 MCP Server 設定 首先當然...

May 28, 20253 min read

[IT 鐵人賽] ASP.NET Core 與 Log 紀錄和追蹤的愛恨交織 - Day 04 - Elmah - 01

.NET Core Logging- Elmah 01 Elmah 是我最一開始使用的 Log 工具,基本上它的功能就是將應用程式所有發生的錯誤記錄下來,不需要改變程式架構,而且又有介面可以觀看,十分的方便;它從 WebForm 時代就有了,到了 MVC 也是運作的很好,那這邊就來介紹一下 Elmah 要如何在 ASP.NET Core 中使用 (.NET Core 也可使用)。 不過很可惜的,目前並沒有釋出官方的 Elmah for .NET Core,不過有一個新專案: ElmahCore...

Oct 19, 20181 min read
[IT 鐵人賽] ASP.NET Core 與 Log 紀錄和追蹤的愛恨交織 - Day 04 - Elmah - 01

[IT 鐵人賽] Azure Data Service - Day 04 - Cognitive Service - 辨識 - Video Indexer

Azure Data Service - Day 04 - Cognitive Service - Vision - Video Indexer 前面幾篇都是介紹靜態影像的辨識與分析,那這篇就來到針對影片來做處理。 Cognitive Service 針對影片辨識的部分提供了:Video Indexer 它整合了許多功能,在這邊列出一些比較重要的功能: 語系偵測 可以自動偵測出這個影片是屬於哪個語系,目前支援: English, Spanish, French, German, Italia...

Oct 19, 20181 min read
[IT 鐵人賽] Azure Data Service - Day 04 - Cognitive Service - 辨識 - Video Indexer

BrainBurst, HeadFirst

45 posts

學習學到老,撞牆撞到腦. A lifelong quest—with forehead dents.