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

日誌

日誌作爲我們程序記錄的“黑匣子”不論什麼系統都應該使用到的,比如我們經常使用的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直接獲取日誌對象然後調用寫日誌方法。

image

當然更常用的是在其它類中通過構造函數注入,使用 DI 中的 ILogger 對象(TCategoryName 類別字符串是任意的,但約定將使用類名稱,在日誌中能知道是哪個類輸出的)。

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

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

上面的控制檯打印我們注意到沒有輸出“調試日誌”,“信息日誌”,這是因爲未設置默認日誌級別,則默認的日誌級別值爲 Information。所以輸出程序只輸出>=Information的日誌。

通過代碼設置:
image

日誌設計的原理

如下我大概畫了一個邏輯圖,對於如何實現日誌進行了一個梳理,代碼部分未.net源碼截取。

image

通過如上的流程我們知道其實日誌對象是由LoggerFactory類創建的,所以我們不使用注入的方式也可以直接獲取日誌對象並寫日誌。

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

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

image

提供程序

目前內置的日誌記錄提供程序:

  • Console:Console 提供程序將輸出記錄到控制檯。
  • Debug:Debug 提供程序使用 System.Diagnostics.Debug 類寫入日誌輸出。
  • EventSource:EventSource 提供程序寫入名稱爲 Microsoft-Extensions-Logging 的跨平臺事件源。
  • EventLog:EventLog 提供程序將日誌輸出發送到 Windows 事件日誌。
    比如我們在測試裏面添加一個EventLog將日誌寫入Windows 事件日誌:
    安裝提供程序包:Install-Package Microsoft.Extensions.Logging.EventLog
    image

內置程序未提供對日誌記錄到文件,所以我們可以使用一些三方包,當然也可以自己開發。

image
查看地址:三方包

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章