iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 3
0
Software Development

ASP.NET Core 之 Log 紀錄和追蹤的愛恨交織系列 第 3

Day 03 - ASP.NET Core 內建之 Logger 02

  • 分享至 

  • xImage
  •  

上一篇已經介紹了 ASP.NET Core 內艦之 Logger 的簡單使用,那接下來就要進階一點了
來介紹一下 ASP.NET Core 內建之 Logger 如何透過設定檔來設定 Log 層級等相關組態與將 Log 輸出到不同地方


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

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

WebHost.CreateDefaultBuilder(args)
    .UseStartup<Startup>()
    .ConfigureLogging(logging => logging.SetMinimumLevel(LogLevel.Warning))
    .Build();

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

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

  • 檔案格式 (INI、JSON 及 XML)。
  • 命令列引數。
  • 環境變數。
  • 記憶體內部 .NET 物件。
  • 未加密的祕密管理員儲存體。
  • 類似 Azure Key Vault 的加密使用者存放區。
  • 自訂提供者 (已安裝或已建立)。

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


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

{
  "Logging": {
    "Debug": {
      "LogLevel": {
        "Default": "Information"
      }
    },
    "Console": {
      "IncludeScopes": false,
      "LogLevel": {
        "Microsoft.AspNetCore.Hosting.Internal.WebHost": "Warning",
        "Microsoft.AspNetCore.Mvc.*": "Warning",
        "System.*": "Critical",
        "Default": "Warning"
      }
    },
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
}

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

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

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

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

  • IncludeScopes: 用來設定是否啟用 LogScope,若為是則會將 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 設定

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureLogging((hostContext, logging)=>
            {
                hostContext.Configuration.GetSection("CustomLogging");
            })
            .UseStartup<Startup>();
}

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


最後來介紹要如何把 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 相關設定

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureLogging((hostContext, logging)=>
            {
               // Console
               logging.AddConsole();
               // Debug
               logging.AddDebug();
               // Event Source
               logging.AddEventSourceLogger();
               // Event Log
               logging.AddEventLog();
               // Azure App Service
               logging.AddAzureWebAppDiagnostics();
            })
            .UseStartup<Startup>();
}

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


上一篇
Day 02 - ASP.NET Core 內建之 Logger 01
下一篇
Day 04 - Elmah - 01
系列文
ASP.NET Core 之 Log 紀錄和追蹤的愛恨交織5
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言