如何通过OpenTelemetry使用Serilog直接向Grafana Loki写入日志
问题分析与解决方案
你遇到的核心问题是混淆了Loki原生推送端点和OTLP端点,加上Loki默认未启用OTLP日志接收器,导致Serilog的OpenTelemetry Sink无法正常推送日志。以下是具体修正步骤:
1. 修正Loki的OTLP端点配置
Serilog的OpenTelemetry Sink需要推送至Loki的OTLP日志端点,而非Loki原生的/loki/api/v1/push。正确的HTTP端点应为:
http://localhost:3100/otlp/v1/logs
2. 补充Loki的OTLP接收器配置
默认情况下Loki未启用OTLP接收器,需要在loki-config.yaml中添加以下配置,确保Loki能接收OTLP格式的日志:
receivers: otlp: protocols: http: endpoint: 0.0.0.0:3100/otlp/v1/logs extensions: health_check: service: pipelines: logs: receivers: [otlp] processors: [] exporters: [loki]
同时保留你已有的limits_config:
limits_config: allow_structured_metadata: true
3. 修正Serilog OpenTelemetry Sink配置
除了端点修正,还需要确保日志属性正确映射到Loki的标签。修正后的代码示例:
.WriteTo.OpenTelemetry(c => { c.Endpoint = "http://localhost:3100/otlp/v1/logs"; c.Protocol = OtlpProtocol.HttpProtobuf; // 配置资源属性,会作为Loki的标签 c.ResourceAttributes = new Dictionary<string, object>() { { "service.name", "tests" } }; // 可选:将日志事件的级别也映射为Loki标签 c.AddLabel("level", e => e.Level.ToString()); })
4. 验证依赖包版本
确保你引用了最新版本的Serilog.Sinks.OpenTelemetry和OpenTelemetry.Exporter.OpenTelemetryProtocol,避免版本兼容问题。
完成以上配置后,重启Loki和你的应用,即可通过OpenTelemetry实现Serilog直接向Loki写入日志。
内容的提问来源于stack exchange,提问作者user963935
相关产品推荐
相关产品推荐

