使用ILogger结合ApplicationInsights时如何自动设置正确的Operation ID?
实现自动为日志设置Application Insights Operation ID的方案
1. 编写Operation ID注入中间件
创建中间件从你的Operation ID服务获取标识,通过日志作用域绑定该ID,Application Insights会自动识别作用域内的OperationId字段并关联到遥测的操作ID。
public class OperationIdMiddleware { private readonly RequestDelegate _next; private readonly ILogger<OperationIdMiddleware> _logger; private readonly IOperationIdProvider _operationIdProvider; // 你的Operation ID服务接口 public OperationIdMiddleware(RequestDelegate next, ILogger<OperationIdMiddleware> logger, IOperationIdProvider operationIdProvider) { _next = next; _logger = logger; _operationIdProvider = operationIdProvider; } public async Task InvokeAsync(HttpContext context) { // 从自定义服务获取正确的Operation ID var operationId = _operationIdProvider.GetOperationId(); // 创建包含Operation ID的日志作用域,AI会自动识别此键 using (_logger.BeginScope(new Dictionary<string, object> { ["OperationId"] = operationId })) { await _next(context); } } } // 中间件扩展注册方法 public static class OperationIdMiddlewareExtensions { public static IApplicationBuilder UseOperationIdScope(this IApplicationBuilder builder) { return builder.UseMiddleware<OperationIdMiddleware>(); } }
2. 注册服务与中间件
在Program.cs中先注册你的Operation ID服务,再将中间件添加到请求管道(需放在业务逻辑中间件之前,确保所有后续日志都处于该作用域内):
var builder = WebApplication.CreateBuilder(args); // 注册自定义Operation ID服务(根据实际需求调整生命周期) builder.Services.AddSingleton<IOperationIdProvider, YourOperationIdProvider>(); // 保留你原有的Application Insights日志配置 builder.Logging.AddApplicationInsights( configureTelemetryConfiguration: config => config.ConnectionString = connectionString, configureApplicationInsightsLoggerOptions: options => { }); var app = builder.Build(); // 注入Operation ID作用域中间件 app.UseOperationIdScope(); // 其他业务中间件配置... app.Run();
3. 效果说明
中间件创建的日志作用域会覆盖当前请求上下文的所有日志,无需修改原有日志调用代码,Application Insights会自动将作用域中的OperationId赋值给遥测的Operation.Id属性,实现同操作ID日志的关联聚合。
如果涉及非HTTP上下文(如后台任务),可参照相同逻辑,在任务执行前获取Operation ID并创建日志作用域即可。
内容的提问来源于stack exchange,提问作者danield
相关产品推荐
相关产品推荐

