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.MyClass1FilePath: 日志所在的具体文件路径(如YourProject/MyClass1.cs)LineNumber: 日志代码对应的行号
内容的提问来源于stack exchange,提问作者andrew.fox
相关产品推荐
相关产品推荐

