.net 溫故知新:【9】.NET紀錄檔記錄 ILogger使用和原理

2022-11-11 12:01:46

紀錄檔

紀錄檔作為我們程式記錄的「黑匣子」不論什麼系統都應該使用到的,比如我們經常使用的log4net就是第三方紀錄檔記錄提供程式。.NET 支援使用各種內建和第三方紀錄檔記錄提供程式的紀錄檔記錄 API,這篇文章主要介紹的是內建提供程式和API的使用並看下他們是如何實現的。

紀錄檔優先順序

如果你使用過log4net的話那麼你對這個優先順序應該不陌生,在紀錄檔記錄過程中我們可以對記錄的紀錄檔資訊進行優先順序劃分,根據優先順序我們可以設定只記錄哪些優先順序別的紀錄檔,同時紀錄檔資訊也會標記這條資訊的優先順序。在我們查詢問題的時候更好的篩選和定位。

.net 的紀錄檔優先順序LogLevel 分為:

Trace = 0、Debug = 1、Information = 2、Warning = 3、Error = 4、Critical = 5 和 None = 6。

紀錄檔級別:

Trace<Debug<Information<Warning<Error<Critical<None

使用控制檯輸出紀錄檔

現在我們來感受下如何用內建提供程式記錄紀錄檔,使用的是.NET 6 控制檯程式進行範例。

  • 新增Install-Package Microsoft.Extensions.Logging 紀錄檔基礎包
    Install-Package Microsoft.Extensions.Logging

  • 新增Microsoft.Extensions.Logging.Console 控制檯輸出紀錄檔提供程式包
    Install-Package Microsoft.Extensions.Logging.Console

  • DI注入

ServiceCollection services = new ServiceCollection();
//新增紀錄檔到容器
services.AddLogging(loggingBuilder =>
    {
        loggingBuilder.AddConsole();
    }
    //回撥,或者是叫委託方法,呼叫AddConsole()新增控制檯輸入提供程式Provider。
    //AddConsole方法就是在Microsoft.Extensions.Logging.Console包中LoggingBuilder的擴充套件方法。
);

可以通過容器Provider直接獲取紀錄檔物件然後呼叫寫紀錄檔方法。

當然更常用的是在其它類中通過建構函式注入,使用 DI 中的 ILogger 物件(TCategoryName 類別字串是任意的,但約定將使用類名稱,在紀錄檔中能知道是哪個類輸出的)。

    public class TestLog
    {
        private readonly ILogger _logger;
        public TestLog(ILogger<TestLog> logger)
        {
            _logger = logger;
        }

        public void Test()
        {
            _logger.LogDebug("測試");
        }
    }

上面的控制檯列印我們注意到沒有輸出「偵錯紀錄檔」,「資訊紀錄檔」,這是因為未設定預設紀錄檔級別,則預設的紀錄檔級別值為 Information。所以輸出程式只輸出>=Information的紀錄檔。

通過程式碼設定:

紀錄檔設計的原理

如下我大概畫了一個邏輯圖,對於如何實現紀錄檔進行了一個梳理,程式碼部分未.net原始碼擷取。

通過如上的流程我們知道其實紀錄檔物件是由LoggerFactory類建立的,所以我們不使用注入的方式也可以直接獲取紀錄檔物件並寫紀錄檔。

            var loggerFactory = LoggerFactory.Create(builder =>
            {
                builder.AddConsole();
                builder.SetMinimumLevel(LogLevel.Debug);
            });

            ILogger loger = loggerFactory.CreateLogger<Program>();

提供程式

目前內建的紀錄檔記錄提供程式:

  • Console:Console 提供程式將輸出記錄到控制檯。
  • Debug:Debug 提供程式使用 System.Diagnostics.Debug 類寫入紀錄檔輸出。
  • EventSource:EventSource 提供程式寫入名稱為 Microsoft-Extensions-Logging 的跨平臺事件源。
  • EventLog:EventLog 提供程式將紀錄檔輸出傳送到 Windows 事件紀錄檔。
    比如我們在測試裡面新增一個EventLog將紀錄檔寫入Windows 事件紀錄檔:
    安裝提供程式包:Install-Package Microsoft.Extensions.Logging.EventLog

內建程式未提供對紀錄檔記錄到檔案,所以我們可以使用一些三方包,當然也可以自己開發。


檢視地址:三方包

在上一篇 .NET 設定 中我們也見到提供程式這個概念,或者是說這種設計結構,其實.net中很多地方都用到提供程式的思維,然可以靈活擴充套件。