日誌
日誌作爲我們程序記錄的“黑匣子”不論什麼系統都應該使用到的,比如我們經常使用的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>();
提供程序
目前內置的日誌記錄提供程序:
- 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中很多地方都用到提供程序的思維,然可以靈活擴展。