You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 01:17:36