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
相关产品推荐
相关产品推荐

