一個完善的系統,必然會有非常完善的日誌記錄,用戶的操作、系統的運行狀況等信息被完整的記錄下來,方便我們對系統進行維護和改進。.net core 也為日誌記錄提供了內置的支持。 在控制台程式中記錄日誌 本段內容摘自《 "在.NET Core控制台應用程式中使用日誌" 》,作者非常詳細的介紹瞭如何在控制 ...
一個完善的系統,必然會有非常完善的日誌記錄,用戶的操作、系統的運行狀況等信息被完整的記錄下來,方便我們對系統進行維護和改進。.net core 也為日誌記錄提供了內置的支持。
在控制台程式中記錄日誌
本段內容摘自《在.NET Core控制台應用程式中使用日誌》,作者非常詳細的介紹瞭如何在控制台應用程式中使用內置的日誌記錄功能。
代碼如下:
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
var serviceCollection = new ServiceCollection()
.AddLogging(loggingBuilder =>
{
loggingBuilder.AddConfiguration(configuration.GetSection("Logging"));
loggingBuilder.AddConsole(); // 將日誌輸出到控制台
})
.AddSingleton<ICalculationService, CalculationService>();
var serviceProvider = serviceCollection.BuildServiceProvider();
var calcService = serviceProvider.GetService<ICalculationService>();
Console.WriteLine(calcService.Add(3, 4));
其實,在拿到ServiceProvider對象後,我們就可以獲取日誌服務了。例如:
var logger = serviceProvider.GetService<ILogger<Program>>();
logger.LogDebug($"系統初始化完成...");
在Asp.Net Core應用中記錄日誌
由於在IWebHostBuilder.CreateDefaultBuilder()
方法中,系統已經幫我們初始化了日誌組件,因此我們可以直接使用ILogger<T>
進行註入。
代碼如下:
[Route("api/[controller]")]
[ApiController]
public class WelcomeController : ControllerBase
{
private readonly ILogger<WelcomeController> logger;
public WelcomeController(ILogger<WelcomeController> logger)
{
this.logger = logger;
}
[HttpGet, HttpPost]
public string Welcome()
{
this.logger.LogInformation($"Welcome...");
return "Welcome... ";
}
}
日誌類別(LogCategory)
日誌類別是在ILogger創建時就需要指定的一個字元串,它用來區分日誌的類別。當我們使用ILogger<T>
創建日誌對象時,日誌類別預設為泛型T的類名。
我們也可以通過ILoggerFactory.CreateLogger
指定日誌類別:
private readonly ILogger logger;
public WelcomeController(ILoggerFactory factory)
{
this.logger = factory.CreateLogger("WelcomeLogger");
}
日誌等級(LogLevel)
日誌等級用來標記日誌的重要程度,在.NetCore中,日誌等級分為以下幾種:
- Trace = 0,記錄跟蹤信息
- Debug = 1,記錄調試信息
- Information = 2,記錄常規信息
- Warning = 3,記錄警告信息,通常為404等不影響系統正常運行的信息
- Error = 4,記錄錯誤信息,通常為異常信息
- Critical = 5,記錄系統錯誤信息,通常為記憶體溢出、磁碟寫滿等
日誌事件ID
每條日誌都可以指定一個事件ID,事件 ID 與一組事件相關聯,用來更加準確的追蹤引發日誌的事件。例如:
//定義事件ID類
public class LoggingEvents
{
public const int GenerateItems = 1000;
public const int ListItems = 1001;
public const int GetItem = 1002;
public const int InsertItem = 1003;
public const int UpdateItem = 1004;
public const int DeleteItem = 1005;
public const int GetItemNotFound = 4000;
public const int UpdateItemNotFound = 4001;
}
//使用事件ID進行日誌記錄
_logger.LogWarning(LoggingEvents.GetItemNotFound, "Item NOT FOUND");
日誌篩選
日誌篩選器可為日誌提供程式指定輸出日誌的最低級別,當大於最低級別時才會被輸出或存儲。例如我們將最低級別設置為Error,則只有Error或Critical日誌才會被展示。
配置文件中設置篩選器
下麵的代碼展示了一個日誌篩選器的配置,併在備註中進行了說明:
{
"Logging": { //日誌配置節點
"LogLevel": { //預設篩選器
"Default": "Debug", //預設日誌類別
"System": "Information" //日誌類別為System
},
"Console": { //針對日誌提供程式Console的配置
"LogLevel": { //日誌篩選器
"Default": "Error", //預設日誌類別
"LoggingSample.Program": "Debug" //日誌類別為LoggingSample.Program的篩選器
}
}
}
}