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);
});
输出结果
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 筛选规则
- 首先匹配提供程序的类型全名或别名。如果没有匹配项,则选择提供程序为空的规则。
- 然后匹配日志类别名称,选择具有最长类别匹配前缀的规则。如果没有匹配项,则选择类别为
Default
的规则。 - 如果选择了多条规则,则采用最后一条。
- 如果没有选择任何规则,则使用
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);
}
输出结果
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.");
}
}
}
输出结果
7. 高性能日志记录
标签:Logging,入门,level,LogLevel,builder,NetCore,日志,logger 来源: https://www.cnblogs.com/renzhsh/p/16630616.html