日志输出配置

在实际开发中,日志是定位线上环境程序问题的最重要依据,我们服务端应用程序的日志通常都以固定格式输出,输出的位置则可能是控制台、磁盘或专门的日志收集服务器上,这种需求仅用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"
    }
  },
  // ... 其它配置
}

内置日志框架有如下日志级别:TraceDebugInformationWarningErrorCritical,代表的日志严重程度按顺序递增。下面例子代码中,我们在控制器里输出了四种级别的日志信息。

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等功能更强大的开源日志框架。有关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框架输出日志了。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap