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

如何在C#代码中获取App Insights请求ID及增强日志?

关于Azure App Insights Web API日志自定义与链路追踪的解决方案

一、App Insights自动请求日志的生成逻辑

当你的Web API集成Microsoft.ApplicationInsights.AspNetCore SDK后,SDK会注入请求遥测中间件,自动拦截所有入站HTTP请求,生成RequestTelemetry类型的遥测数据并上报到App Insights。这些默认日志包含请求URL、响应状态码、处理时长、客户端IP等基础信息,属于SDK内置的自动采集能力。

二、给自动生成的请求日志添加自定义值

完全可以实现,以下是两种常用方案:

方式1:自定义遥测处理器

创建继承ITelemetryProcessor的处理器类,在遥测数据上报前修改RequestTelemetry,添加自定义属性:

public class CustomRequestTelemetryProcessor : ITelemetryProcessor
{
    private readonly ITelemetryProcessor _next;

    public CustomRequestTelemetryProcessor(ITelemetryProcessor next)
    {
        _next = next;
    }

    public void Process(ITelemetry item)
    {
        if (item is RequestTelemetry requestTelemetry)
        {
            // 添加自定义业务属性,示例从请求头获取业务ID
            requestTelemetry.Properties["BusinessId"] = HttpContextAccessor.HttpContext.Request.Headers["X-Business-Id"].FirstOrDefault();
            requestTelemetry.Properties["DeploymentEnv"] = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
        }

        _next.Process(item);
    }
}

在Program.cs中注册处理器:

builder.Services.AddApplicationInsightsTelemetry();
builder.Services.AddSingleton<ITelemetryProcessor, CustomRequestTelemetryProcessor>();

方式2:请求管道中直接修改

通过HTTP上下文获取当前RequestTelemetry,直接添加自定义字段:

app.Use(async (context, next) =>
{
    var requestTelemetry = context.Features.Get<RequestTelemetry>();
    if (requestTelemetry != null)
    {
        // 示例添加自定义关联ID
        requestTelemetry.Properties["CustomCorrelationId"] = context.Request.Headers["X-Correlation-Id"].FirstOrDefault();
    }
    await next();
});

三、获取App Insights请求ID并关联后续处理日志

可以通过多种方式获取App Insights生成的请求ID,实现全链路日志关联:

方式1:从HTTP上下文的RequestTelemetry获取

public class PostRequestProcessor
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    private readonly ILogger<PostRequestProcessor> _logger;

    public PostRequestProcessor(IHttpContextAccessor httpContextAccessor, ILogger<PostRequestProcessor> logger)
    {
        _httpContextAccessor = httpContextAccessor;
        _logger = logger;
    }

    public async Task Execute()
    {
        var requestTelemetry = _httpContextAccessor.HttpContext.Features.Get<RequestTelemetry>();
        if (requestTelemetry != null)
        {
            string aiRequestId = requestTelemetry.Id;
            // 将此ID作为关联ID记录后续日志
            _logger.LogInformation("后续处理启动,关联App Insights请求ID:{AiRequestId}", aiRequestId);
            // 执行业务逻辑
        }
    }
}

注意:需先注册IHttpContextAccessor:

builder.Services.AddHttpContextAccessor();

方式2:从.NET Activity中获取

App Insights基于.NET Activity实现链路追踪,请求ID同步到Activity.Current.Id:

public void ProcessBusinessLogic()
{
    string requestId = Activity.Current?.Id;
    if (!string.IsNullOrEmpty(requestId))
    {
        _logger.LogInformation("业务处理中,关联请求ID:{RequestId}", requestId);
    }
}

方式3:通过TelemetryClient获取当前上下文

public class BusinessService
{
    private readonly TelemetryClient _telemetryClient;
    private readonly ILogger<BusinessService> _logger;

    public BusinessService(TelemetryClient telemetryClient, ILogger<BusinessService> logger)
    {
        _telemetryClient = telemetryClient;
        _logger = logger;
    }

    public void HandleTask()
    {
        string requestId = _telemetryClient.Context.Operation.Id;
        _logger.LogInformation("任务处理,App Insights请求ID:{RequestId}", requestId);
    }
}

内容的提问来源于stack exchange,提问作者Pranoy Tez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 06:05:15