19 | 日志作用域:解决不同请求之间的日志干扰
日志作用域的场景
- 一个事务包含多条操作时
- 复杂流程的日志关联时
- 调用点追踪与请求处理过程对应时
示例
继续沿用上一节代码,稍微做一些修改
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
namespace LoggingSimpleDemo
{
class Program
{
static void Main(string[] args)
{
// 利用之前的方式加载json配置
var builder = new ConfigurationBuilder();
builder.AddJsonFile("appsettings.json", false, true);
var config = builder.Build();
IServiceCollection servicesCollection = new ServiceCollection();
// 使用工厂模式将配置对象注册到容器管理
servicesCollection.AddSingleton<IConfiguration>(p => config);
servicesCollection.AddLogging(builder =>
{
builder.AddConfiguration(config.GetSection("Logging"));
builder.AddConsole();
builder.AddDebug();
});
IServiceProvider services = servicesCollection.BuildServiceProvider();
var logger = services.GetService<ILogger<Program>>();
// 创建一个BeginScope,泛型方法BeginScope<TState>为多次相关的日志记录操作创建一个相同的执行上下文范围,并将其上下文范围与一个TState对象进行关联。
using (logger.BeginScope("ScopeId : {id}",Guid.NewGuid()))
{
logger.LogInformation("Scope.Info");
logger.LogError("Scope.Error");
}
Console.ReadKey();
}
}
}
创建一个BeginScope
,泛型方法BeginScope<TState>
为多次相关的日志记录操作创建一个相同的执行上下文范围,并将其上下文范围与一个TState
对象进行关联。
并在配置文件**appsettings.json**
中**Console**
下添加**"IncludeScopes": true,**
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
},
"Console": {
"IncludeScopes": true,
"LogLevel": {
"Default": "Information",
"Program": "Trace",
"alogger": "Information",
"LoggingSimpleDemo.OrderService": "Trace"
}
}
}
}
这时候执行代码:
然后我们将代码其改成循环输出的
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
using System.Threading;
namespace LoggingSimpleDemo
{
class Program
{
static void Main(string[] args)
{
// 利用之前的方式加载json配置
var builder = new ConfigurationBuilder();
builder.AddJsonFile("appsettings.json", false, true);
var config = builder.Build();
IServiceCollection servicesCollection = new ServiceCollection();
// 使用工厂模式将配置对象注册到容器管理
servicesCollection.AddSingleton<IConfiguration>(p => config);
servicesCollection.AddLogging(builder =>
{
builder.AddConfiguration(config.GetSection("Logging"));
builder.AddConsole();
builder.AddDebug();
});
IServiceProvider services = servicesCollection.BuildServiceProvider();
var logger = services.GetService<ILogger<Program>>();
while (Console.ReadKey().Key != ConsoleKey.Escape)
{
// 创建一个BeginScope,泛型方法BeginScope<TState>为多次相关的日志记录操作创建一个相同的执行上下文范围,并将其上下文范围与一个TState对象进行关联。
using (logger.BeginScope("ScopeId : {id}", Guid.NewGuid()))
{
logger.LogInformation("Scope.Info");
logger.LogError("Scope.Error");
}
// 日志输出内部时异步的,需要等待以下保证输出顺序正确
Thread.Sleep(200);
Console.WriteLine("=============================================");
}
}
}
}
每次输出如下
这是,我们手动改一下配置,将**IncludeScopes: true**
改为**false**
,再按回车
可以看到输出发生了变化,也就意味着我们可以使用配置热更新的能力。
在.NET Core Web
中可以在配置中添加**IncludeScopes: true**
输出日志的时候,可以包含信息帮助我们把日志串联起来
本文作者:hiwwwk
本文链接:https://www.cnblogs.com/wwwk/p/15873395.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步