.NET6、Serilog及Application Insights升级后应用名称不显示问题
解决.NET6下Serilog Application Insights应用名称为空的问题
问题原因
升级到.NET6及最新版Serilog.Sinks.ApplicationInsights后,旧版本中自动将Serilog全局Properties里的Application映射到App Insights应用名称(即Cloud.RoleName)的默认行为已被移除,导致配置的应用名称无法正常显示。
解决方案
方法一:自定义Telemetry初始化器
通过实现ITelemetryInitializer,手动将Serilog上下文中的Application属性赋值给App Insights的RoleName:
- 创建自定义初始化器类:
using Microsoft.ApplicationInsights.Channel; using Microsoft.ApplicationInsights.Extensibility; using Serilog.Context; public class ApplicationNameTelemetryInitializer : ITelemetryInitializer { public void Initialize(ITelemetry telemetry) { if (string.IsNullOrEmpty(telemetry.Context.Cloud.RoleName) && LogContext.TryGetProperty("Application", out var appProperty)) { // 去除字符串两端的引号(适配JSON配置的字符串属性格式) telemetry.Context.Cloud.RoleName = appProperty.Value.ToString().Trim('"'); } } }
- 在Worker Service的DI容器中注册该初始化器:
// Program.cs中 builder.Services.AddSingleton<ITelemetryInitializer, ApplicationNameTelemetryInitializer>();
方法二:使用Serilog的Enrich直接添加属性
修改Serilog配置,将Application属性通过WithProperty enricher添加,确保属性能被日志上下文捕获:
"Enrich": [ "FromLogContext", { "Name": "WithProperty", "Args": { "name": "Application", "value": "ApplicationName" } } ], "WriteTo": [ { "Name": "ApplicationInsights", "Args": { "restrictedToMinimumLevel": "Information", "telemetryConverter": "Serilog.Sinks.ApplicationInsights.TelemetryConverters.TraceTelemetryConverter, Serilog.Sinks.ApplicationInsights", "InstrumentationKey": "<Key>" } } ]
方法三:自定义Telemetry转换器
继承默认的TraceTelemetryConverter,在转换日志事件时手动设置应用名称:
- 创建自定义转换器类:
using Serilog.Events; using Serilog.Sinks.ApplicationInsights.TelemetryConverters; using Microsoft.ApplicationInsights.DataContracts; using System.Globalization; public class CustomTraceTelemetryConverter : TraceTelemetryConverter { protected override void Configure(TraceTelemetry telemetry, LogEvent logEvent, IFormatProvider formatProvider) { base.Configure(telemetry, logEvent, formatProvider); if (logEvent.Properties.TryGetValue("Application", out var appProperty)) { telemetry.Context.Cloud.RoleName = appProperty.ToString().Trim('"'); } } }
- 在Serilog配置中指定自定义转换器:
"WriteTo": [ { "Name": "ApplicationInsights", "Args": { "restrictedToMinimumLevel": "Information", "telemetryConverter": "YourProjectNamespace.CustomTraceTelemetryConverter, YourProjectAssembly", "InstrumentationKey": "<Key>" } } ]
内容的提问来源于stack exchange,提问作者Fernando
相关产品推荐
相关产品推荐

