You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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());

当前现象

  1. 日志可正常输出到控制台和文件,但Application Insights无日志。
  2. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 21:18:13