.NET Core API与Worker Service的Serilog日志无法写入Azure Application Insights求助
Azure Application Insights 日志不上报问题解决方案
1. 修正Serilog初始化顺序
你当前的Serilog初始化时机晚于Host构建,且未显式加载配置,会导致Sink配置未生效。请按以下顺序调整Program.cs代码:
在Host构建前先加载配置、初始化Serilog、启用自诊断:
// Program.cs 入口最开头执行 var configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddEnvironmentVariables() .Build(); // 提前启用自诊断,捕获初始化阶段错误 Serilog.Debugging.SelfLog.Enable(msg => Debug.WriteLine(msg)); // 显式从配置加载Serilog规则 Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(configuration) .CreateLogger(); try { // 原有Host构建逻辑 await Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration(AppConfigurationServices.Configure) .ConfigureLogging(LoggerServices.Configure) .ConfigureServices(HostServices.Configure) // 添加强制释放参数,确保程序退出时刷新日志缓冲区 .UseSerilog(dispose: true) .RunHostAsync(options); } catch (Exception ex) { Log.Fatal(ex, "程序启动失败"); } finally { Log.CloseAndFlush(); }
2. 补全Application Insights服务注册
仅安装NuGet包不会自动启用遥测发送,需要手动注册服务:
- ASP.NET Core Web API项目,在
ConfigureServices中添加:
services.AddApplicationInsightsTelemetry(Configuration);
- Worker Service项目,在
ConfigureServices中添加:
services.AddApplicationInsightsTelemetryWorkerService(Configuration);
3. 关闭采样规则验证
默认的自适应采样可能会过滤掉部分测试日志,可临时关闭采样验证上报功能:
在appsettings.json的ApplicationInsights节点添加配置:
"ApplicationInsights": { "InstrumentationKey": "xxx-xyz", "EnableAdaptiveSampling": false }
同时确认你测试的日志级别不低于Serilog中配置的restrictedToMinimumLevel(当前配置为Information,Debug、Verbose级别日志不会上报)。
4. 验证网络连通性
- 本地调试环境:确认没有代理拦截对
dc.services.visualstudio.com:443的请求 - Azure虚拟机部署环境:检查NSG规则、Windows防火墙是否放行443端口出站请求,可执行PowerShell命令验证连通性:
Test-NetConnection dc.services.visualstudio.com -Port 443
5. 验证Application Insights资源状态
- 确认配置的InstrumentationKey和Azure Portal中对应资源的密钥完全一致,无多余字符
- 进入Azure Portal对应Application Insights资源的「使用情况和预估成本」页面,确认配额未耗尽,资源未被禁用。
6. 强制刷新遥测缓冲区
Application Insights SDK默认会批量上报遥测数据,测试时可主动触发刷新确认数据上报:
// 注入TelemetryClient后调用 telemetryClient.Flush(); // 等待5秒确保数据发送完成 await Task.Delay(5000);
内容的提问来源于stack exchange,提问作者Florin Vîrdol
相关产品推荐
相关产品推荐

