Azure Application Insights未写入日志问题求助
排查Azure Application Insights无Serilog日志输出问题
环境信息
- Serilog.Settings.Configuration 3.4.0
- Serilog.Sinks.ApplicationInsights 4.0.0
当前配置
appsettings.json 配置
"Serilog": { "Using": [ "Serilog.Sinks.ApplicationInsights" ], "MinimumLevel": { "Default": "Information", "Override": { "Microsoft": "Warning", "System": "Warning" } }, "Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId", "WithThreadId" ], "WriteTo": [ { "Name": "Console", "Args": { "restrictedToMinimumLevel": "Information" } }, { "Name": "ApplicationInsights", "Args": { "restrictedToMinimumLevel": "Information", "telemetryConverter": "Serilog.Sinks.ApplicationInsights.Sinks.ApplicationInsights.TelemetryConverters.TraceTelemetryConverter, Serilog.Sinks.ApplicationInsights" } } ] }
Program.cs 代码
public class Program { public static void Main(string[] args) { ConfigureLogger(); try { Log.Information("MyApp: Application Starting Up"); CreateHostBuilder(args).Build().Run(); } catch (Exception ex) { Log.Fatal(ex, "MyApp: The applicaion failed to start correctly."); } finally { Log.CloseAndFlush(); } } public static IHostBuilder CreateHostBuilder(string[] args) { return Host.CreateDefaultBuilder(args) .UseSerilog() .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }); } private static void ConfigureLogger() { var configuration = new ConfigurationBuilder() .AddJsonFile("appsettings.json", false, true) .Build(); var configureLogger = new Action<IConfiguration, bool>((configuration, update) => { try { Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(configuration, "Serilog") .CreateLogger(); if (update) { Log.Logger.Information("MyApp: Updated logger configuration."); } } catch (Exception ex) { Log.Logger.Error(ex, "MyApp: Failed to update logger configuration."); } }); var updateLoggerTimer = new Timer((state) => { configureLogger(configuration, true); }, null, Timeout.Infinite, Timeout.Infinite); ChangeToken.OnChange(() => configuration.GetReloadToken(), () => { // Use timer to debounce onchange, it fires twice when configuration changes updateLoggerTimer.Change(TimeSpan.FromSeconds(1), Timeout.InfiniteTimeSpan); }); configureLogger(configuration, false); } }
Startup.cs 配置
services.AddApplicationInsightsTelemetry();
排查步骤
1. 补充Application Insights连接配置
当前Serilog的AI sink配置缺少关键的连接信息,需要明确指定连接字符串:
在appsettings.json的Serilog.WriteTo[1].Args中添加connectionString字段,填入你的Application Insights连接字符串:
"Args": { "restrictedToMinimumLevel": "Information", "telemetryConverter": "Serilog.Sinks.ApplicationInsights.Sinks.ApplicationInsights.TelemetryConverters.TraceTelemetryConverter, Serilog.Sinks.ApplicationInsights", "connectionString": "你的Application Insights连接字符串" }
2. 简化日志配置逻辑
手动构建配置对象可能和主机默认配置源冲突,建议让Serilog直接使用主机统一配置:
修改CreateHostBuilder方法,移除独立的ConfigureLogger逻辑:
public static IHostBuilder CreateHostBuilder(string[] args) { return Host.CreateDefaultBuilder(args) .UseSerilog((context, config) => { config.ReadFrom.Configuration(context.Configuration) .Enrich.FromLogContext() .Enrich.WithMachineName() .Enrich.WithProcessId() .Enrich.WithThreadId(); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }); }
同时删除Main方法中的ConfigureLogger()调用,确保配置一致性。
3. 验证日志输出链路
- 先确认控制台能正常输出日志,若控制台有日志但AI无数据,说明问题出在AI sink的配置或网络;
- 临时将AI sink的
restrictedToMinimumLevel改为Debug,排查是否因级别过滤导致日志未发送; - 检查应用网络是否能访问Azure服务,排除防火墙、代理拦截的可能。
4. 确认日志刷新逻辑
确保应用退出时Log.CloseAndFlush()正常执行,Serilog会缓冲日志,未刷新的话可能无法发送到AI。可在关键业务逻辑后手动调用Log.Flush()测试。
5. 检查包版本兼容性
确认Serilog核心包版本与Serilog.Settings.Configuration、Serilog.Sinks.ApplicationInsights兼容,建议升级到最新稳定版的Serilog核心包。
内容的提问来源于stack exchange,提问作者Vivek Nuna
相关产品推荐
相关产品推荐

