其他分享
首页 > 其他分享> > NetCore 入门 (六) : 日志系统

NetCore 入门 (六) : 日志系统

作者:互联网

1. QuickStart

1.1 NuGet包

Microsoft.Extensions.Logging.Abstractions; // 抽象依赖包
Microsoft.Extensions.Logging; // 默认实现
Microsoft.Extensions.Logging.Configuration; // Logging对Configuration的支持
Microsoft.Extensions.Logging.Console; // 针对Console的日志输出
Microsoft.Extensions.Logging.Debug; // 针对Debug的日志输出

1.2 入门示例

var services = new ServiceCollection();

services.AddLogging(builder =>
{
    builder
    .SetMinimumLevel(LogLevel.Trace) // 设置最低日志输出级别
    .AddConsole() // 添加Console输出
    .AddDebug(); // 添加Debug输出
});

var serviceProvider = services.BuildServiceProvider();

// 方式1: 通过ILoggerFactory创建ILogger
ILoggerFactory factory = serviceProvider.GetRequiredService<ILoggerFactory>();
ILogger<Program> logger = factory.CreateLogger<Program>();

// 方式2:直接获取ILogger
//ILogger<Program> logger = serviceProvider.GetRequiredService<ILogger<Program>>();

// 获取日志级别
var levels = (LogLevel[])Enum.GetValues(typeof(LogLevel));

Array.ForEach(levels, level =>
{
    logger.Log(level, "this is a/an {0} log message.", level);
});

输出结果

Debug输出
Console输出

2. 日志提供程序

不同的日志提供程序将日志输出到不同的位置。框架内置了以下日志日志提供程序:

提供程序 别名 Nuget包
ConsoleLoggerProvider Console Microsoft.Extensions.Logging.Console
DebugLoggerProvider Debug Microsoft.Extensions.Logging.Debug
EventSourceLoggerProvider EventSource Microsoft.Extensions.Logging.EventSource
EventLogLoggerProvider EventLog Microsoft.Extensions.Logging.EventLog
TraceSourceLoggerProvider TraceSource Microsoft.Extensions.Logging.TraceSource

具体请参考内置日志记录提供程序

3. 日志级别

public enum LogLevel
{
    Trace = 0,
    Debug = 1,
    Information = 2,
    Warning = 3,
    Error = 4,
    Critical = 5,
    None = 6
}

等级说明

日志等级 描述
Trace 用于记录一些相对详细的信息,以帮助开发人员针对某个问题进行跟踪调试。这样的日志往往包含敏感数据,所以在默认情况下不应该开启此等级。
Debug 用于记录一些辅助调试的信息,这样的日志具有较短的时效性。
Information 用来向管理员传达系统的当前状态。让管理员了解:系统的哪些模块在运行,刚刚处理了什么事件,方便进行系统维护。
Warning 应用出现了一些不正常的行为,当前的处理流程可以正常进行,但是进一步操作的话可能会导致更严重的错误。
Error 当前的处理流程因未被处理的异常而终止,但是整个应用不至于崩溃。
Critical 当前应用出现了难以恢复的崩溃,或者出现了需要引起足够重视的灾难性事件。
None 不输出任何日志信息。

4. 日志配置

Microsoft.Extensions.Logging.Configuration包提供了对Configuration的支持。

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "System": "Information"
    },
    "Console": {
      "IncludeScopes": true,
      "LogLevel": {
        "Microsoft": "Warning"
      }
    }
  }
}

添加配置

var config = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json")
    .Build();

var services = new ServiceCollection();

services.AddLogging(builder =>
{
    builder
    .AddConfiguration(config) 
    .AddDebug();
});

5. 日志筛选

日志在输出之前,要先经过日志筛选。只有满足条件的日志才会被真正的记录下来。

5.1 设置最低级别

使用SetMinimumLevel方法为所有的日志设置最低的日志输出级别,默认情况下是Information

var services = new ServiceCollection();

services.AddLogging(builder =>
{
    builder
    .SetMinimumLevel(LogLevel.Warning)
    .AddDebug();
});

var serviceProvider = services.BuildServiceProvider();

ILogger<Program> logger = serviceProvider.GetRequiredService<ILogger<Program>>();

// 获取日志级别
var levels = (LogLevel[])Enum.GetValues(typeof(LogLevel));

Array.ForEach(levels, level =>
{
    logger.Log(level, "this is a/an {0} log message.", level);
});

输出结果

LoggerTutorial.Program: Warning: this is a/an Warning log message.
LoggerTutorial.Program: Error: this is a/an Error log message.
LoggerTutorial.Program: Critical: this is a/an Critical log message.

5.2 添加过滤函数

针对日志类别

builder.AddFilter("foo", LogLevel.Error);  // 最低日志级别
builder.AddFilter("foo", level => level >= LogLevel.Error); // 最低日志级别
builder.AddFilter("foo", level => level == LogLevel.Error); // 只输出日志级别为Error的日志

针对Provider

builder.AddFilter<ConsoleLoggerProvider>(level => level >= LogLevel.Error);

builder.AddFilter<ConsoleLoggerProvider>("foo", LogLevel.Warning); 
builder.AddFilter<ConsoleLoggerProvider>("foo", level => level >= LogLevel.Error);

builder.AddFilter<ConsoleLoggerProvider>((catalog, level) =>
{
    return level >= LogLevel.Information;
});

自定义

// 只考虑日志类别
builder.AddFilter((catalog, level) => 
{
    return level >= LogLevel.Information;
});

// 同时考虑日志类别和provider
builder.AddFilter((provider, catalog, level) =>
{
    return level >= LogLevel.Information;
});

5.3 使用配置文件

{
  "Logging": {
    "Debug": {
      "LogLevel": {
        "Default": "Information"
      }
    },
    "Console": {
      "IncludeScopes": false,
      "LogLevel": {
        "Microsoft.AspNetCore.Mvc.Razor.Internal": "Warning",
        "Microsoft.AspNetCore.Mvc.Razor.Razor": "Debug",
        "Microsoft.AspNetCore.Mvc.Razor": "Error",
        "Default": "Information"
      }
    },
    "LogLevel": {
      "Default": "Debug"
    }
  }
}

5.4 筛选规则

  1. 首先匹配提供程序的类型全名或别名。如果没有匹配项,则选择提供程序为空的规则。
  2. 然后匹配日志类别名称,选择具有最长类别匹配前缀的规则。如果没有匹配项,则选择类别为Default的规则。
  3. 如果选择了多条规则,则采用最后一条。
  4. 如果没有选择任何规则,则使用MinimumLevel

6. 日志作用域

日志作用域(Log Scope) 具有如下特点:

::: tip 说明
日志作用域需要日志提供程序ILoggerProvider的支持。如果支持该特性,那么它提供的ILogger对象能够感知到当前日志作用域的存在。
:::

6.1 演示: 事务的执行

var services = new ServiceCollection();

services.AddLogging(builder =>
{
    builder
    .AddConsole(options => options.IncludeScopes = true) // 开启日志作用域
    .AddDebug();
});

var serviceProvider = services.BuildServiceProvider();

var logger = serviceProvider.GetRequiredService<ILogger<Program>>();

using (logger.BeginScope("Transaction[{0}]", Guid.NewGuid()))
{
    var stopwatch = Stopwatch.StartNew();
    await Task.Delay(500);
    logger.LogInformation("Step one completes at {0}", stopwatch.Elapsed);

    await Task.Delay(300);
    logger.LogInformation("Step two completes at {0}", stopwatch.Elapsed);

    await Task.Delay(800);
    logger.LogInformation("Step three completes at {0}", stopwatch.Elapsed);
}

输出结果

Console
Debug

6.2 演示: 逻辑调用链

var services = new ServiceCollection();

services.AddLogging(builder =>
{
    builder
    .AddConsole(options => options.IncludeScopes = true) // 开启日志作用域
    .AddDebug();
});

var serviceProvider = services.BuildServiceProvider();

var logger = serviceProvider.GetRequiredService<ILogger<Program>>();

using (logger.BeginScope("foo"))
{
    logger.LogInformation("this is a log in scope foo.");

    using (logger.BeginScope("bar"))
    {
        logger.LogInformation("this is a log in scope bar.");

        using (logger.BeginScope("baz"))
        {
            logger.LogInformation("this is a log in scope baz.");
        }
    }
}

输出结果

Console

7. 高性能日志记录

LoggingMessage

标签:Logging,入门,level,LogLevel,builder,NetCore,日志,logger
来源: https://www.cnblogs.com/renzhsh/p/16630616.html