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

Serilog.Sinks.ApplicationInsights v3.1升级v4.0时抛出异常

问题排查思路
  • v4.0版本的Serilog Application Insights Sink已彻底移除对直接传入instrumentationKey配置项的兼容,底层不再依赖已废弃的TelemetryConfiguration.Active全局单例,旧配置中直接写入instrumentationKey的写法会触发配置绑定异常,与报错截图表现完全一致。
  • Azure Function运行时默认自带Application Insights SDK的依赖注入注册逻辑,v4.0版本的Sink优先从DI容器获取预配置完成的TelemetryClient实例,不再支持独立初始化客户端,旧的纯配置文件初始化逻辑未对接Function的DI管道,会直接导致初始化失败。
  • v4版本对Sink的配置参数做了不兼容更新,旧版本的instrumentationKey参数已被正式移除,不再被配置绑定逻辑识别,保留该参数不会被Sink读取,反而会因缺少必填的TelemetryClient/ConnectionString配置抛出初始化异常。
解决方案

第一步:更新基础配置

  • 确认NuGet包版本:将Serilog.Sinks.ApplicationInsights升级到4.0+稳定版,不要手动覆盖Azure Function运行时自带的Microsoft.ApplicationInsights包版本,避免版本冲突。
  • 移除Serilog配置节点中ApplicationInsights Sink配置下的instrumentationKey项,调整后的Serilog配置示例如下:
"Serilog": {
  "Using": [
    "Serilog.Sinks.ApplicationInsights"
  ],
  "WriteTo": [
    {
      "Name": "ApplicationInsights",
      "Args": {
        "restrictedToMinimumLevel": "Verbose",
        "telemetryConverter": "Serilog.Sinks.ApplicationInsights.Sinks.ApplicationInsights.TelemetryConverters.TraceTelemetryConverter, Serilog.Sinks.ApplicationInsights"
      }
    }
  ]
}
  • 将Application Insights认证信息迁移到Azure Function标准配置项:在appsettings.json根节点或Function应用的应用程序设置中,配置APPLICATIONINSIGHTS_CONNECTION_STRING项,值填写Application Insights资源的连接字符串,不需要再单独给Serilog传递认证密钥。

第二步:调整Startup初始化逻辑

不要在创建Logger时独立初始化Application Insights Sink,需对接Azure Function的DI管道,使用运行时预配置好的TelemetryClient实例,修改Startup.cs代码如下:

using Microsoft.ApplicationInsights;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Serilog;

[assembly: FunctionsStartup(typeof(YourProjectNamespace.Startup))]
namespace YourProjectNamespace
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            var config = new ConfigurationBuilder()
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddEnvironmentVariables()
                .Build();

            // 从DI容器获取运行时预配置完成的TelemetryClient
            var serviceProvider = builder.Services.BuildServiceProvider();
            var telemetryClient = serviceProvider.GetRequiredService<TelemetryClient>();

            Log.Logger = new LoggerConfiguration()
                .ReadFrom.Configuration(config)
                // 显式传入TelemetryClient实例,避免Sink独立初始化
                .WriteTo.ApplicationInsights(telemetryClient, new Serilog.Sinks.ApplicationInsights.Sinks.ApplicationInsights.TelemetryConverters.TraceTelemetryConverter())
                .CreateLogger();
            
            // 将Serilog注册到日志管道
            builder.Services.AddLogging(logBuilder =>
            {
                logBuilder.AddSerilog(Log.Logger, dispose: true);
            });
        }
    }
}

第三步:异常场景验证

  • 如果本地调试抛出TelemetryClient未注册的异常,检查项目是否引用了与Function运行时版本匹配的Microsoft.Azure.WebJobs.Logging.ApplicationInsights包,不需要额外安装其他Application Insights相关依赖。
  • 配置文件中不要残留任何Serilog节点下的instrumentationKey参数,v4版本不再识别该参数,残留会触发配置绑定错误。
  • 部署前可本地写入测试日志,到Application Insights的traces表中验证日志上报、级别映射、自定义属性是否符合预期。

内容的提问来源于stack exchange,提问作者Alex Monkey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 22:15:48