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

