认识.NET 日志系统

基本概念

  1. 日志级别:Trace<Debug<Information<Waring<Error<Critical
  2. 日志提供者(LoggingProvider):把日志输出控制台、文件、数据库等。
  3. .NET的日志非常灵活,对于业务代码只要注入日志对象记录日志即可,具体哪些日志输出到哪里、什么样的格式、是否输出等都有配置或者初始化代码决定。

列子:输出到控制台

  1. NuGet:Microsoft.Extensions.Logging、Microsoft.Extensions.Logging.Console。

  2. DI注入:

    services.AddLogging(logbuilder=>{
     logBuilder.AddConsole() //可多个Provider
    })
    
  3. 需要记录日志的代码,注入ILogger即可,T一般就用当前类,这个类的名字会输出到日志,方便定位错误,然后调用LogInformation()、LogError等方法输入不同级别的日志,还支持输出异常对象。

代码

Program类

using LogginDemo1;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

//用于注册依赖注入
ServiceCollection services = new ServiceCollection();
services.AddLogging(logBuilder =>
{
    logBuilder.AddConsole();
});
services.AddScoped<Test1>();

using var sp = services.BuildServiceProvider();
var test1 = sp.GetRequiredService<Test1>();
test1.Test();

Test类

ILogger 通常写当前使用到的类,可以方便的定位错误。

using Microsoft.Extensions.Logging;

namespace LogginDemo1;

public class Test1
{
    private readonly ILogger<Test1> _logger;

    public Test1(ILogger<Test1> logger)
    {
        _logger = logger;
    }

    public void Test()
    {
        _logger.LogDebug("开始执行数据库同步");
        _logger.LogDebug("连接数据库成功");
        _logger.LogWarning("查找数据失败,重试第一次");
        _logger.LogWarning("查找数据失败,重试第二次");
        _logger.LogError("查找数据最终失败");
    }
}

打印效果

Snipaste_2023-08-28_15-17-51

LogDebug级别太低,默认不输出,如果需要显示Debug信息,则需要进一步配置。

services.AddLogging(logBuilder =>
{
    logBuilder.AddConsole();
    logBuilder.SetMinimumLevel(LogLevel.Trace); //设置最低级别
});

Snipaste_2023-08-28_15-20-34

异常处理

可以直接传入ex对象,错误信息将会打印出来。

try
{
    File.ReadAllText("A:/1.txt");
    _logger.LogDebug("读取文件成功");
}
catch (Exception ex)
{
    _logger.LogError(ex,"读取文件失败");
}

Snipaste_2023-08-28_15-26-59

参考链接

每日一道面试题

简述 private、 protected、 public、 internal 修饰符的访问权限。

答 .

  1. private : 私有成员, 在类的内部才可以访问。
  2. protected : 保护成员,该类内部和继承类中可以访问。
  3. public : 公共成员,完全公开,没有访问限制。
  4. internal: 在同一命名空间内可以访问。