一個完善的系統,必然會有非常完善的日志記錄,用戶的操作、系統的運行狀況等信息被完整的記錄下來,方便我們對系統進行維護和改進。.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的篩選器
}
}
}
}