Serilog无法向Application Insights上报日志事件求助
问题:Serilog结合Application Insights日志上报异常
环境与依赖
- 系统:macOS 15.2
- .NET SDK:v9.0.100
- 使用的NuGet包:
<PackageReference Include="Serilog.Extensions.Logging" Version="9.0.0" /> <PackageReference Include="Serilog.Sinks.ApplicationInsights" Version="4.0.0" /> <PackageReference Include="Serilog.Sinks.Console" Version="6.0.0" /> <PackageReference Include="Serilog.Sinks.File" Version="6.0.0" /> <PackageReference Include="Splat.Microsoft.Extensions.DependencyInjection" Version="15.2.22" /> <PackageReference Include="Splat.Microsoft.Extensions.Logging" Version="15.2.22" />
日志配置代码
var logConfig = new LoggerConfiguration() .WriteTo.File( new JsonFormatter(), PathToLogFile, shared: true); var appInsightConnectionString = configuration.GetSection(AppInsightLoggingSection).Value; logConfig.WriteTo.ApplicationInsights( new TelemetryConfiguration { ConnectionString = appInsightConnectionString }, TelemetryConverter.Traces, LogEventLevel.Fatal); logConfig.WriteTo.Console(); Log.Logger = logConfig.CreateLogger(); services.AddLogging(builder => builder.ClearProviders().AddSerilog());
当前现象
- 日志可正常输出到控制台和文件,但Application Insights无日志。
- 修改Main方法代码后:
public static void Main(string[] args) { try { BuildAvaloniaApp().StartWithClassicDesktopLifetime(args); } catch (Exception ex) { var logger = Services.GetRequiredService<ILogger<App>>(); logger.LogCritical("TEST"); Log.Fatal(ex, "UnexpectedException"); } finally { Log.CloseAndFlush(); } }
logger.LogCritical("TEST")无法上报到Application Insights;- 后续的
Log.Fatal(ex, "UnexpectedException")能成功将异常上报到Application Insights。
解决思路
1. 修复TelemetryConfiguration初始化方式
手动实例化TelemetryConfiguration会跳过默认初始化流程(如TelemetryInitializer加载),建议改用官方推荐的初始化方法:
var telemetryConfig = TelemetryConfiguration.CreateDefault(); telemetryConfig.ConnectionString = appInsightConnectionString; logConfig.WriteTo.ApplicationInsights(telemetryConfig, TelemetryConverter.Traces, LogEventLevel.Fatal);
2. 排查DI容器中ILogger的有效性
catch块中获取ILogger<App>时,容器可能未完成完整初始化,导致该实例未绑定到Serilog。可以尝试在应用启动成功后先测试ILogger的日志上报,确认容器初始化完成后的日志是否正常。
3. 启用Serilog自我日志排查错误
添加Serilog内部日志输出,查看是否存在发送失败的具体错误:
Serilog.Debugging.SelfLog.Enable(msg => Console.WriteLine(msg));
该日志会输出Serilog内部的异常或警告,比如连接字符串无效、权限不足等问题。
4. 验证Application Insights连接有效性
直接使用TelemetryClient测试发送,排除连接本身的问题:
var telemetryConfig = TelemetryConfiguration.CreateDefault(); telemetryConfig.ConnectionString = appInsightConnectionString; var client = new TelemetryClient(telemetryConfig); client.TrackTrace("Test Critical Trace", SeverityLevel.Critical); client.Flush();
如果该测试能成功上报,说明连接无问题,问题出在Serilog与Microsoft.Extensions.Logging的集成环节。
5. 检查日志级别映射与批量发送机制
- 确认Microsoft.Extensions.Logging的
LogCritical与Serilog的LogEventLevel.Fatal映射正确(两者级别是对应匹配的); - Serilog的Application Insights Sink默认批量发送日志,
Log.CloseAndFlush()会触发批量提交。若ILogger的日志未被Serilog捕获,会导致无法被批量发送。
内容的提问来源于stack exchange,提问作者Viktor Spáčil
相关产品推荐
相关产品推荐

