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

C#从Azure Application Insights检索日志的替代实现方案

C# 从Azure Application Insights检索日志的弃用包替代方案

旧的Microsoft.Azure.ApplicationInsights包已经停止维护,目前生产可落地的实现方案主要有两种,均为官方支持的能力:

方案1:使用Azure.Monitor.Query 官方SDK(首选)

这是微软当前主推的正式SDK,属于Azure Monitor官方SDK体系,完全覆盖traces、exceptions、requests等所有内置表、自定义表的查询能力,支持完整KQL(Kusto查询语言)语法。
注意:当前Application Insights已经深度整合进Azure Monitor生态,日志数据实际存储在关联的Log Analytics工作区中,用该SDK完全对齐产品后续迭代路线,无弃用风险

实现步骤

  • 权限配置:在Azure AD注册服务主体,给目标Application Insights资源分配Monitoring Reader角色;生产环境也可以直接用Azure托管身份做免密认证,不需要硬编码凭据。
  • 安装NuGet依赖:
    • Azure.Monitor.Query:核心日志查询能力
    • Azure.Identity:提供Azure统一身份认证能力
  • 参考实现代码:
using Azure.Identity;
using Azure.Monitor.Query;
using Azure.Monitor.Query.Models;

// 认证逻辑:本地开发时可以直接替换为DefaultAzureCredential(),自动读取Visual Studio/Azure CLI的登录凭据,无需手动配密钥
var credential = new ClientSecretCredential(
    tenantId: "你的Azure租户ID",
    clientId: "服务主体客户端ID",
    clientSecret: "服务主体客户端密钥"
);

var logsClient = new LogsQueryClient(credential);
// 替换为你的Application Insights资源完整ID,可在Azure门户资源的“属性”页找到
var appInsightsResourceId = "/subscriptions/<订阅ID>/resourceGroups/<资源组名>/providers/microsoft.insights/components/<AppInsights实例名>";

// 编写KQL查询语句,按需筛选日志类型、时间范围、字段
string kql = @"
union traces, exceptions, requests
| where timestamp > ago(24h)
| order by timestamp desc
| take 200
";

// 执行查询
LogsQueryResult queryResult = await logsClient.QueryResourceAsync(
    new ResourceIdentifier(appInsightsResourceId),
    kql,
    new QueryTimeRange(TimeSpan.FromHours(24))
);

// 遍历处理结果
foreach (LogsTableRow row in queryResult.Value.Table.Rows)
{
    DateTimeOffset logTime = row.GetDateTimeOffset("timestamp");
    string? message = row.GetString("message");
    int? severity = row.GetInt32("severityLevel");
    // 自定义维度、自定义指标等字段都可以按列名直接读取
}

方案优势

  • 官方长期更新维护,适配最新的服务端能力
  • 支持强类型结果映射、分页查询、批量查询、部分查询失败重试等开箱即用能力
  • 身份认证方式灵活,支持本地开发免密、生产环境托管身份、服务主体等多种模式,安全性更高

方案2:直接调用Application Insights 原生REST API

如果不想引入额外SDK依赖,可以直接调用服务端原生查询接口,逻辑和SDK底层实现一致,灵活度更高。

实现步骤

  • 权限配置和方案1一致,推荐用Azure AD获取Bearer Token做认证,不推荐使用旧版API密钥(权限颗粒度粗,已经逐步被淘汰)。
  • 用原生HttpClient发POST请求调用查询端点,请求体传入KQL语句和时间范围即可。
  • 参考实现代码:
using System.Net.Http.Headers;
using System.Text.Json;
using Azure.Identity;

// 获取Azure AD认证Token
var credential = new ClientSecretCredential("租户ID", "客户端ID", "客户端密钥");
var tokenResult = await credential.GetTokenAsync(new Azure.Core.TokenRequestContext(new[] { "https://api.loganalytics.io/.default" }));

var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenResult.Token);

var requestPayload = new
{
    query = "union traces,exceptions,requests | where timestamp > ago(24h) | take 200",
    timespan = "PT24H"
};

// 替换为你的App Insights对应的查询地址和应用ID
var apiResponse = await httpClient.PostAsJsonAsync(
    "https://api.loganalytics.io/v1/apps/<你的AppInsights应用ID>/query",
    requestPayload
);
apiResponse.EnsureSuccessStatusCode();
// 解析返回的JSON结果即可
var resultDoc = JsonDocument.Parse(await apiResponse.Content.ReadAsStringAsync());

方案优势

  • 依赖极少,只需要基础的HTTP客户端能力即可实现
  • 逻辑完全可控,适合需要自定义请求规则、做轻量集成的场景

落地注意事项

  • 不要使用非官方第三方封装的App Insights查询SDK,这类包普遍存在维护不及时、认证逻辑有安全隐患、不支持新KQL语法等问题
  • 旧包的原有KQL查询逻辑基本可以无缝平移,不需要重写业务查询规则,只需要替换客户端初始化和结果遍历的代码
  • 生产环境优先使用托管身份认证,避免硬编码密钥、连接字符串等敏感信息,降低凭据泄露风险

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:57:21