紀錄檔作為我們程式記錄的「黑匣子」不論什麼系統都應該使用到的,比如我們經常使用的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
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>();
目前內建的紀錄檔記錄提供程式:
Install-Package Microsoft.Extensions.Logging.EventLog
內建程式未提供對紀錄檔記錄到檔案,所以我們可以使用一些三方包,當然也可以自己開發。
檢視地址:三方包
在上一篇 .NET 設定 中我們也見到提供程式這個概念,或者是說這種設計結構,其實.net中很多地方都用到提供程式的思維,然可以靈活擴充套件。
作者:SunSpring
出處:https://www.cnblogs.com/SunSpring/p/16875968.html
本文版權歸作者所有,歡迎轉載,但未經作者同意需在文章頁面明顯位置給出原文連結。