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

.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:

  1. 创建自定义初始化器类:
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('"');
        }
    }
}
  1. 在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,在转换日志事件时手动设置应用名称:

  1. 创建自定义转换器类:
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('"');
        }
    }
}
  1. 在Serilog配置中指定自定义转换器:
"WriteTo": [
  {
    "Name": "ApplicationInsights",
    "Args": {
      "restrictedToMinimumLevel": "Information",
      "telemetryConverter": "YourProjectNamespace.CustomTraceTelemetryConverter, YourProjectAssembly",
      "InstrumentationKey": "<Key>"
    }
  }
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:46:05