ASP.NET Core日志无法显示在Application Insights?Serilog与OpenTelemetry配置排查
问题分析与修复配置
缺失的关键配置点
1. OpenTelemetry未启用日志采集与导出
当前OpenTelemetry仅配置了追踪(Tracing)功能,未开启日志(Logging)的收集逻辑,导致日志无法通过Azure Monitor管道上报。需补充.WithLogging()配置,指定日志级别、格式并关联Azure Monitor导出器:
builder.Services.AddOpenTelemetry() .UseAzureMonitor() .ConfigureResource(x => { x.AddAttributes(new Dictionary<string, object> { { "service.name", "my-service" } }); }) .WithTracing() .WithLogging(logging => { logging.SetMinimumLevel(LogLevel.Information); // 配置要收集的最低日志级别 logging.IncludeFormattedMessage = true; logging.IncludeScopes = true; logging.AddAzureMonitorLogExporter(); // 启用Azure Monitor日志导出 });
2. Serilog的OpenTelemetry Sink未指定有效上报目标
默认的WriteTo.OpenTelemetry()没有配置Application Insights的上报端点和认证信息,导致Serilog日志无法送达。需补充sink的端点、资源属性和连接字符串配置:
builder.Services.AddSerilog((services, lc) => lc .ReadFrom.Configuration(builder.Configuration) .ReadFrom.Services(services) .Enrich.FromLogContext() .WriteTo.Console(builder.Environment.IsDevelopment() ? new RenderedCompactJsonFormatter() : new CompactJsonFormatter()) .WriteTo.OpenTelemetry(options => { options.Endpoint = "https://dc.services.visualstudio.com/v2/track"; options.ResourceAttributes = new Dictionary<string, object> { { "service.name", "my-service" } }; options.SetToken(builder.Configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"]); }) );
优化建议(二选一)
无需同时维护两套日志上报逻辑,推荐以下两种简化方案:
- 方案一:OpenTelemetry统一接管日志
保留上述OpenTelemetry的.WithLogging()配置,移除Serilog的WriteTo.OpenTelemetry()。Serilog.AspNetCore已将Serilog日志接入ASP.NET Core日志系统,OpenTelemetry会自动收集并导出到Azure Monitor。 - 方案二:Serilog直接上报到Application Insights
替换Serilog.Sinks.OpenTelemetry为Serilog.Sinks.ApplicationInsights包,直接通过Serilog sink将日志发送到Application Insights,无需依赖OpenTelemetry中转。
验证方法
修改配置后重启应用,触发日志输出(如_logger.LogInformation("测试日志")),等待5-10分钟后,在Application Insights的「日志」面板中查询traces表,即可看到上报的日志条目。
内容的提问来源于stack exchange,提问作者mrk
相关产品推荐
相关产品推荐

