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

.NET项目OpenTelemetry上报Elastic Observability日志变量未解析问题

解决.NET OpenTelemetry日志在Elastic Observability中显示占位符而非实际值的问题

这个问题不是LogLevel配置导致的,核心原因是OpenTelemetry默认保留了ASP.NET Core的结构化日志消息模板,没有将占位符替换为实际属性值。以下是具体的解决步骤:

关键配置:启用消息模板渲染

在项目的OpenTelemetry日志配置中,需要开启ParseStateValues选项,让OpenTelemetry自动将日志模板与属性结合,生成填充了实际值的日志消息。

示例代码(Program.cs)

var builder = WebApplication.CreateBuilder(args);

// 注册其他服务...

builder.Services.AddOpenTelemetry()
    .WithLogging(logging =>
    {
        logging
            // 添加Elasticsearch导出器并配置端点
            .AddElasticsearchExporter(options =>
            {
                options.Endpoint = new Uri("http://your-elastic-instance:9200");
                // 若Elastic开启了认证,添加对应配置:
                // options.ApiKey = "your-api-key";
                // 或使用用户名密码:
                // options.Username = "elastic";
                // options.Password = "your-password";
            })
            // 设置服务标识(可选,用于Elastic中区分服务)
            .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(builder.Environment.ApplicationName))
            // 核心配置:解析状态值,渲染占位符为实际值
            .ParseStateValues = true;
    });

var app = builder.Build();

// 中间件配置...

app.Run();

关于appsettings.json的说明

  1. 无需在OpenTelemetry节点添加LogLevel:项目Logging节点下的LogLevel配置会被OpenTelemetry继承,用于控制日志输出级别。如果需要单独过滤OpenTelemetry的日志,可以在WithLogging中添加AddFilter规则,例如:
    logging.AddFilter("Microsoft.AspNetCore", LogLevel.Warning);
    
  2. 你当前的OpenTelemetry节点配置(CollectorEndpoint和Headers)主要用于对接OpenTelemetry Collector,如果你是直接导出到Elasticsearch,这些配置可以忽略,直接在AddElasticsearchExporter中配置端点即可。

验证效果

配置完成后重新启动项目,生成相关日志(比如请求连接日志),在Elastic Observability的Logs Explorer中就能看到类似Connection id "0HN6DP7I45OBC" stopped.的完整日志内容了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 14:37:04