Serilog OpenTelemetry Sink配置HttpProtobuf协议不生效问题
Serilog OpenTelemetry Sink HttpProtobuf协议配置问题排查
问题现象
配置Serilog OpenTelemetry Sink通过HttpProtobuf协议发送日志至Otel Collector,但日志无法送达。开启Serilog自日志后,控制台输出错误:
Grpc.Core.RpcException: Status(StatusCode="Unknown", Detail="Bad gRPC response. HTTP status code: 405") at Serilog.Core.Sinks.Batching.BatchingSink.LoopAsync()
该错误说明Sink未正确识别HttpProtobuf配置,仍尝试以gRPC协议发送请求。
用户配置代码:
builder.Host.UseSerilog((ctx, serviceProvider, lc) => { lc = lc.ReadFrom.Configuration(ctx.Configuration) .WriteTo.Console(); var otlpEndpoint = builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]; if (!string.IsNullOrWhiteSpace(otlpEndpoint)) { lc.WriteTo.OpenTelemetry(cfg => { cfg.Endpoint = $"{otlpEndpoint}/v1/logs"; cfg.Protocol = OtlpProtocol.HttpProtobuf; }); } });
排查与解决方案
1. 检查Serilog.OpenTelemetry包版本
旧版本的Serilog.OpenTelemetry可能存在Protocol配置不生效的问题,确保安装最新稳定版(版本≥1.0.0)。
2. 确认Otel Collector接收器配置
Otel Collector默认仅开启gRPC协议的OTLP接收器(端口4317),需手动添加otlphttp接收器以支持HttpProtobuf协议。修改Collector配置文件(如config.yaml):
receivers: otlp: endpoint: 0.0.0.0:4317 otlphttp: endpoint: 0.0.0.0:4318 service: pipelines: logs: receivers: [otlp, otlphttp] processors: [] exporters: [your-exporter]
3. 修正配置顺序与优先级
若配置文件(如appsettings.json)中已定义OpenTelemetry Sink配置,会覆盖代码中的设置。调整代码顺序,确保自定义配置不被覆盖:
builder.Host.UseSerilog((ctx, serviceProvider, lc) => { // 先添加自定义Sink配置 lc.WriteTo.Console(); var otlpEndpoint = builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]; if (!string.IsNullOrWhiteSpace(otlpEndpoint)) { lc.WriteTo.OpenTelemetry(cfg => { cfg.Endpoint = $"{otlpEndpoint}/v1/logs"; cfg.Protocol = OtlpProtocol.HttpProtobuf; }); } // 最后读取配置文件,补充其他配置 lc.ReadFrom.Configuration(ctx.Configuration); });
4. 验证端点地址正确性
确保OTEL_EXPORTER_OTLP_ENDPOINT的值指向Collector的otlphttp端口,格式为http://<collector-host>:4318(而非gRPC的4317端口)。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

