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

ASP.NET Core 8 OpenTelemetry日志如何在Application Insights显示类名

解决ASP.NET Core 8中OpenTelemetry日志缺少类名和文件路径的问题

问题原因

你当前的OpenTelemetry配置仅启用了指标(Metrics)和追踪(Tracing)模块,未显式配置日志(Logging)的属性收集逻辑,导致ILogger<MyClass1>对应的类名、日志所在文件路径等上下文信息,没有被注入到Application Insights的CustomDimensions字段中。

解决方案

需要在OpenTelemetry配置中补充日志收集规则,明确指定要包含的上下文属性,具体操作如下:

1. 补充日志收集配置

在原有的AddOpenTelemetry配置链中加入.WithLogging()方法,用于定义日志的处理和属性注入规则。

2. 注入类名、文件路径等属性

在.WithLogging()中配置属性提取逻辑,将类名(含命名空间)、文件路径、行号等信息添加到日志属性中,这些属性会自动被Azure Monitor同步到CustomDimensions里。

修改后的完整配置代码

builder.Services
       .AddOpenTelemetry()
       .UseAzureMonitor(x => x.ConnectionString = configuration.AppIns.ConnStr)
       .ConfigureResource(builder =>
            {
                builder.Clear();
                builder
                    .AddService(serviceName: "MyService1", serviceInstanceId: Environment.MachineName);
            })
       .WithMetrics(builder => {})
       .WithTracing()
       .WithLogging(loggingBuilder =>
        {
            // 启用日志范围和格式化消息
            loggingBuilder.IncludeFormattedMessage = true;
            loggingBuilder.IncludeScopes = true;

            // 注入类名、文件路径等属性到日志记录
            loggingBuilder.AddProcessor(logRecord =>
            {
                // 添加LoggerName(即类的完整命名空间+类名)
                if (!string.IsNullOrEmpty(logRecord.LoggerName))
                {
                    logRecord.AddAttribute("LoggerName", logRecord.LoggerName);
                }

                // 提取并添加文件路径、行号(需保留调试符号)
                if (logRecord.TryGetStackTrace(out var stackTrace))
                {
                    var topFrame = stackTrace?.FrameCount > 0 ? stackTrace.GetFrame(0) : null;
                    if (topFrame != null)
                    {
                        // 添加类名(从方法声明类型提取)
                        var declaringType = topFrame.GetMethod()?.DeclaringType;
                        if (declaringType != null)
                        {
                            logRecord.AddAttribute("ClassName", declaringType.FullName);
                        }
                        // 添加文件路径和行号
                        logRecord.AddAttribute("FilePath", topFrame.GetFileName());
                        logRecord.AddAttribute("LineNumber", topFrame.GetFileLineNumber());
                    }
                }
            });

            // 配置日志过滤规则(可选)
            loggingBuilder.AddFilter("YourNamespace.MyClass1", LogLevel.Information);
            loggingBuilder.AddFilter("*", LogLevel.Warning);
        });

关键说明

  • 类名获取:ILogger<MyClass1>的LoggerName默认就是类的完整命名空间+类名,直接添加为属性即可在CustomDimensions中看到。
  • 文件路径与行号:需要确保项目编译时保留调试符号:
    • 开发环境默认启用;
    • 生产环境需在项目文件中配置<DebugType>pdbonly</DebugType>,或在发布设置中勾选"保留符号"。
  • 日志查询:在Application Insights中,可通过customDimensions.LoggerName、customDimensions.ClassName等字段查询对应信息。

验证效果

调用_logger.LogInformation("test1")后,Application Insights日志的CustomDimensions会包含以下字段:

  • LoggerName: YourNamespace.MyClass1(实际命名空间+类名)
  • ClassName: YourNamespace.MyClass1
  • FilePath: 日志所在的具体文件路径(如YourProject/MyClass1.cs)
  • LineNumber: 日志代码对应的行号

内容的提问来源于stack exchange,提问作者andrew.fox

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 19:53:16