在.Net Core中记录日志

By | 2019年9月18日

一个完善的系统,必然会有非常完善的日志记录,用户的操作、系统的运行状况等信息被完整的记录下来,方便我们对系统进行维护和改进。.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的筛选器
            }
        }
    }
}

参考文档

发表评论