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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:08:12