# [IT 鐵人賽] ASP.NET Core 與 Log 紀錄和追蹤的愛恨交織 - Day 03 - ASP.NET Core 內建之 Logger 02

---

#### .NET Core Logging- Logging in ASP.NET Core 02

上一篇已經介紹了 ASP.NET Core 內艦之 Logger 的簡單使用，那接下來就要進階一點了

來介紹一下 ASP.NET Core 內建之 Logger 如何透過設定檔來設定 Log 層級等相關組態與將 Log 輸出到不同地方

---

首先先來看要如何設定 Log 層級，在一般沒有任何設定也就是預設的情況下，預設 Log 層級是 Information，所以會在 Console 中顯示除了 Trace 和 Debug 以外所有的訊息，如下圖紅框顯示

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1776070422200/bec68388-3c79-4c8d-b277-e6b4ae175891.png)

如果我們想要設定只有 Warning 以上才顯示，最簡單的方式就是直接在 `Program.cs` 的 `BuildWebHost` 方法中加入 `ConfigureLogging()` 設定

這樣最低 Log 層級就會被設為 Warning 以上

但是如果每次要更改 Log 層級都要修改程式碼，這樣也太擾人了，所以其實它還支援其他方式進行設定，包括透過設定檔的方式，設定方式如下：

* 檔案格式 (INI、JSON 及 XML)。
* 命令列引數。
* 環境變數。
* 記憶體內部 .NET 物件。
* 未加密的[祕密管理員](https://docs.microsoft.com/zh-tw/aspnet/core/security/app-secrets?view=aspnetcore-2.1)儲存體。
* 類似 [Azure Key Vault](https://docs.microsoft.com/zh-tw/aspnet/core/security/key-vault-configuration?view=aspnetcore-2.1) 的加密使用者存放區。
* 自訂提供者 (已安裝或已建立)。

預設就已經會讀取 `appsettings.json`中的 `Logging`區段設定組態

---

除此之外還可以透過設定來進行 Log Filter 功能，這邊以`appsettins.json`為範例說明

在 Logging 區段中，分為 Debug、Console、LogLevel 三個，一一來說明

Debug 區段，Debug 在這邊代表的是輸出到 Debug Provider 中，有可能是 Debug 視窗或是 Debug 指定的容器

* Default: 簡單來說就是會套用到未明確列出條件的所有 Log
  這邊就是記錄 Information 層級以上的 Log

Console 區段，Console 在這邊代表的是輸出到 Console 中

* IncludeScopes: 用來設定是否啟用 [L](https://docs.microsoft.com/zh-tw/aspnet/core/fundamentals/logging/?view=aspnetcore-2.1#log-scopes)ogScope，若為是則會將 LogScope 中所產生的 Log 輸出出來，若否則相反；LogScope 請參考：<https://bit.ly/2PUO6Ws>

LogLevel 用來設定相關紀錄層級

* Microsoft.AspNetCore.Hosting.Internal.WebHost: 當 Log 的來源之 namespace 為 Microsoft.AspNetCore.Hosting.Internal.WebHost 時，就會套用此條件
  紀錄 Warning 層級以上的 Log
* Microsoft.AspNetCore.Mvc.\*: 當 Log 的來源之 namespace 為 Microsoft.AspNetCore.Mvc **底下所有的 namespace** 時 (包含 Microsoft.AspNetCore.Mvc )，就會套用此條件
  紀錄 Warning 層級以上的 Log
* System.\*: 當 Log 的來源之 namespace 為 System **底下所有的 namespace** 時 (包含 System )
* Default: 簡單來說就是會套用到未明確列出條件的所有 Log
  這邊就是記錄 Warning 層級以上的 Log

LogLevel 區段，假設上面都不符合的話，會套用到此條件

* Default: 簡單來說就是會套用到未明確列出條件的所有 Log
  這邊就是記錄 Warning 層級以上的 Log

> NOTE: 若 namespace 無 \* 時，namespace 必須完全符合才會觸發規則
> NOTE: 若都無指定時，預設 Log Filter 為記錄 Debug 以上所有 Log

---

若要修改設定所存放之地方，可以於 `Program.cs` 中的 `CreateWebHostBuilder`，加上 `ConfigureLogging` 相關設定，以下面為例，就是從 `CustomLogging` 區段中讀取 Log 設定

> 也可以從其他檔案中讀取相關設定

---

最後來介紹要如何把 Log 輸出到不同的地方

ASP.NET Core 內建以下 Provider：

* Console
* Debug
* EventSource
* EventLog
* TraceSource (必須執行在 .NET Framework 中)
* Azure App Service (會將 Log 輸出至診斷紀錄 (Diagnostics) 中，配合 App Service 中針對診斷紀錄的設定即可達成；例如輸出到儲存體)

也有第三方提供者，參考：<https://bit.ly/2zmZpRO>

使用方式其實很簡單，只要在 `Program.cs` 中的 `CreateWebHostBuilder`，加上 `ConfigureLogging` 相關設定

---

ASP.NET Core 內建 Logging 就介紹到此，下一篇將介紹使用 Elamh 來進行紀錄
