ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

NetCore 入门 (六) : 日志系统

2022-08-27 15:34:24  阅读:257  来源: 互联网

标签:Logging 入门 level LogLevel builder NetCore 日志 logger


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"
      }
    }
  }
}
  • 日志的配置通常由配置文件的Logging部分提供。
  • Logging 下的 LogLevel 属性指定所选类别的最低级别。LogLevel下的其他属性设置为日志类别的前缀,可以匹配多个日志类型。
  • Logging下的其他属性代表日志提供程序,可以使用提供程序的类型全名或别名。本示例使用的是控制台提供程序。如果支持日志作用域, IncludeScopes将指示是否启用该功能。LogLevel属性用于配置当前提供程序下所选类别的最低级别。

添加配置

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) 具有如下特点:

  • 唯一标识。位于同一作用域的日志具有唯一标识信息,这样方便开发者将多条相关的日志综合起来分析问题。
  • 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有