如何在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
相关产品推荐
相关产品推荐

