在实际开发中,日志是定位线上环境程序问题的最重要依据,我们服务端应用程序的日志通常都以固定格式输出,输出的位置则可能是控制台、磁盘或专门的日志收集服务器上,这种需求仅用Console.WriteLine()
打印内容肯定是不行的。ASP.Net Core中,微软默认集成了Microsoft.Extensions.Logging
日志框架,它提供了日志分级、自定义日志格式等功能,此外我们也可以集成NLog等其它的开源日志框架。
这篇笔记我们详细介绍ASP.Net Core中如何配置日志框架并输出日志信息。
ASP.Net Core内置的内置日志框架不需要我们手动配置,它默认已经注册了,我们直接使用即可。在appsettings.json
配置文件中,我们可以看到日志相关的配置,其中指定了全局和Microsoft.AspNetCore
命名空间的输出日志级别(如果以开发环境启动,注意查看的应该是appsettings.Development.json
配置文件)。
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
// ... 其它配置
}
内置日志框架有如下日志级别:Trace
、Debug
、Information
、Warning
、Error
、Critical
,代表的日志严重程度按顺序递增。下面例子代码中,我们在控制器里输出了四种级别的日志信息。
using DemoWebAPI.Filters;
using DemoWebAPI.Model;
using Microsoft.AspNetCore.Mvc;
namespace DemoWebAPI.Controllers;
[ApiController]
[Route("api/Demo")]
public class DemoController : ControllerBase
{
private ILogger<DemoController> _logger;
public DemoController(ILogger<DemoController> logger)
{
_logger = logger;
}
[HttpGet]
[Route("DemoAction")]
[MyActionFilter]
public ActionResult<ApiResult> DemoAction()
{
_logger.LogDebug("Debug级别日志");
_logger.LogInformation("Information级别日志");
_logger.LogWarning("Warning级别日志");
_logger.LogError("Error级别日志");
return ApiResult.Success();
}
}
运行程序并调用控制器方法,我们会看到控制台上打印如下几条信息。
info: DemoWebAPI.Controllers.DemoController[0]
Information级别日志
warn: DemoWebAPI.Controllers.DemoController[0]
Warning级别日志
fail: DemoWebAPI.Controllers.DemoController[0]
Error级别日志
由于我们的全局日志级别配置为了Information
级别,所以_logger.LogDebug("Debug级别日志")
这一行输出的内容并没有打印,如果我们将全局日志级别改为Debug
,这条日志就会输出了。
微软内置的日志框架实现比较简陋,我们也可以使用NLog等功能更强大的开源日志框架。有关NLog框架在软件工程/dotNet/dotNet扩展库/Logging-日志框架
章节有详细介绍,这里就不展开赘述了,我们主要介绍ASP.NET Core如何与NLog日志框架集成使用。
首先,我们需要安装NLog框架及其与ASP.NET Core集成相关的依赖。
dotnet add package NLog.Web.AspNetCore --version 5.3.15
dotnet add package NLog.Extensions.Logging --version 5.3.15
在Program.cs
中,我们需要注入NLog框架相关组件。
using NLog;
using NLog.Web;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
// 配置NLog
builder.Logging.ClearProviders();
builder.Logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
builder.Host.UseNLog();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseAuthorization();
app.MapControllers();
app.Run();
此外,我们还需要在appsettings.json
文件中编写NLog相关配置。在早期版本中,NLog和ASP.NET Core集成后还是需要读取自己的nlog.config
配置文件,但新版本不需要那么复杂了,我们直接在appsettings.json
中配置即可。
{
"NLog": {
"targets": {
"file": {
"type": "File",
"fileName": "logs/${shortdate}.log",
"layout": "${longdate} ${level:uppercase=true} ${message} ${exception}"
},
"console": {
"type": "Console",
"layout": "${longdate} ${level:uppercase=true} ${message} ${exception}"
}
},
"rules": [
{
"logger": "*",
"minLevel": "Info",
"writeTo": "file,console"
}
]
}
}
如上配置好后,我们就可以使用NLog框架输出日志了。