Serilog对接OpenTelemetry抛出Grpc.Core.RpcException问题求助
排查Serilog + OpenTelemetry 向Jaeger发送日志失败的问题
错误核心原因
- 报错
unknown service opentelemetry.proto.collector.logs.v1.LogsService:Jaeger默认的OTLP接收器未启用OpenTelemetry Logs服务协议支持,它默认仅接收Traces(追踪)数据,没有提供Logs(日志)的处理端点。 - 后续的404错误是Serilog尝试向Jaeger发送日志请求,但目标端点不存在导致的。
可行解决方案
方案1:将Serilog日志作为OpenTelemetry Span事件发送(推荐)
Jaeger核心定位是追踪系统,更适配接收关联到Span的事件数据。修改Serilog配置,把日志绑定到Active Span或作为Span事件发送:
Log.Logger = new LoggerConfiguration() .Enrich.FromLogContext() .WriteTo.OpenTelemetry(options => { options.Endpoint = "http://localhost:4317"; options.ResourceAttributes = new Dictionary<string, object> { { "service.name", "your-service-name" } }; // 指定发送Trace信号,将日志转为Span事件 options.IncludedSignalTypes = new[] { OpenTelemetry.Trace.TraceSignal.Name }; }) .CreateLogger();
方案2:启用Jaeger的Logs接收功能
若需发送独立日志到Jaeger,需修改Docker启动命令,开启OTLP Logs接收器(Jaeger v1.35+支持该特性,属于实验性功能):
docker run -d --name jaeger \ -e COLLECTOR_OTLP_ENABLED=true \ -e COLLECTOR_OTLP_LOGS_ENABLED=true \ -p 4317:4317 \ -p 16686:16686 \ jaegertracing/all-in-one:latest
方案3:通过OpenTelemetry Collector中转(更灵活)
若需统一处理日志、追踪、指标,建议部署OpenTelemetry Collector作为中转:
- 配置Collector接收OTLP Logs数据,再转发到Jaeger;
- 修改Serilog的
Endpoint指向Collector的OTLP端口。
额外验证项
- 确认
Serilog.Sinks.OpenTelemetryNuGet包为最新版本,避免版本兼容问题; - 检查.NET应用网络权限,确保能访问
localhost:4317; - 注意:Python代码能成功是因为它发送的是Traces数据,而Jaeger默认支持Traces接收。
内容的提问来源于stack exchange,提问作者BipinR
相关产品推荐
相关产品推荐

