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

如何用ILogger与Application Insights关联自定义日志?含多场景适配

跨场景实现Application Insights日志关联方案

要让自定义日志、HttpClient/ADO.NET的日志在Application Insights中自动关联,核心是手动创建统一的操作上下文——替代ASP.NET Core MVC自动生成的请求上下文,让所有相关操作的日志都绑定到同一个操作ID上。以下是具体实现方案:

1. 用OperationHolder手动创建操作范围

在执行API调用的逻辑块前后,通过TelemetryClient启动一个操作范围,这个范围内的所有日志会自动共享同一个OperationId,Application Insights会将它们归为一组。

修改你的API调用代码如下:

// 注入的TelemetryClient实例
private readonly ITelemetryClient _telemetryClient;

// ...

// 启动操作上下文,指定操作名称和类型
using var operation = _telemetryClient.StartOperation<DependencyTelemetry>($"API调用: {apiName}");
operation.Telemetry.Type = "Http";
operation.Telemetry.Target = new Uri(url).Host;
operation.Telemetry.Data = url;

// 自定义日志自动关联当前操作ID
_logger.LogTrace("调用API {ApiName}", new { ApiName = apiName, Data = json });

try
{
    var httpResponse = await _httpClient.PostAsync(url, new StringContent(json));
    // 记录HTTP状态码到遥测数据
    operation.Telemetry.ResultCode = httpResponse.StatusCode.ToString();
    httpResponse.EnsureSuccessStatusCode();
    
    var responseDto = await JsonSerializer.DeserializeAsync<ResponseDto>(httpResponse.Content.ReadAsStream())!;

    if (!responseDto.Success)
    {
        var responseContent = await httpResponse.Content.ReadAsStringAsync();
        _logger.LogWarning("API调用失败 {ApiName}", new { ApiName = apiName, Data = responseContent });
        operation.Telemetry.Success = false;
    }
    else
    {
        operation.Telemetry.Success = true;
    }
}
catch (Exception ex)
{
    _logger.LogError(ex, "API调用 {ApiName} 抛出异常", apiName);
    operation.Telemetry.Success = false;
    operation.Telemetry.Exception = ex;
    throw;
}

2. 配置HttpClient的遥测关联

要让HttpClient的日志自动绑定到操作上下文,需要在注册HttpClient时添加Application Insights的跟踪处理器:

services.AddHttpClient()
        .AddApplicationInsightsTelemetryHandler();

这个处理器会自动将HttpClient的请求日志关联到当前的操作ID,无需额外代码。

3. ADO.NET日志关联配置

对于数据库操作,启用Application Insights的SQL跟踪即可让ADO.NET日志自动关联到操作上下文:

services.AddApplicationInsightsTelemetry()
        .AddSqlClientTelemetry();

只要数据库操作在OperationHolder的范围内执行,日志就会自动归组到同一个操作下。

4. Blazor Server场景适配

Blazor Server没有HTTP请求上下文,需要在业务逻辑块(比如组件的点击事件、异步方法)中手动创建操作上下文:

private async Task TriggerApiCall()
{
    using var operation = _telemetryClient.StartOperation<DependencyTelemetry>("Blazor组件API调用: UserApi");
    // 执行API调用、数据库操作等逻辑
    // 所有日志自动关联到当前操作ID
}

Blazor的异步上下文会自动保留操作ID,无需额外传递。

核心注意事项

  • 所有需要关联的操作必须放在OperationHolder的using块内,确保上下文生效。
  • 手动创建的DependencyTelemetry可以补充操作元数据(如类型、目标、结果码),方便在Application Insights门户中筛选和查看。
  • 保持Application Insights SDK为最新版本,避免上下文传递的兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:55:17