向Loki流式传输SaaS日志时的loghttp报错及JSON嵌套问题咨询
Loki Push接口嵌套JSON结构支持性说明
核心结论
Loki 不支持在streams结构的stream字段内嵌套任意非字符串类型的JSON对象。
报错核心原因
这类expects " or n, but found {的解析报错,本质是请求结构不符合Loki Push接口的schema要求:
stream字段的定位是索引标签集合,所有键值对的值必须为字符串类型。Loki的标签是用于日志筛选的索引维度,本身不支持嵌套结构、原生对象、数组等非字符串值。- 从你提供的报错上下文片段可以看到,你在
stream字段中写入了"log": {嵌套JSON对象}的内容,解析器读取到这个位置时,本来期待拿到字符串或数值类型的标签值,却碰到了代表JSON对象起始的{符号,因此直接抛出类型不匹配错误,和报错定位的字节位置完全对应。
高频触发场景
- 错误将日志正文内容塞入标签段:从你提供的curl示例可以看到,你将本应属于日志正文的超大JSON对象,放到了
stream字段的标签值位置,没有和标签元数据做分离。 - 未对日志内容做字符串序列化:嵌套的JSON日志作为日志正文传输时,必须先序列化为字符串格式,不能直接作为原生JSON值嵌套在请求结构中。
- 标签值类型不符合规范:哪怕是自定义的业务标签,只要值为对象、数组类型,都会触发同类解析错误。
正确的请求结构参考
{ "streams": [ { "stream": { "env": "dev_logs", "service": "saas_platform" }, "values": [ [ "1617704515000000000", "{\"id\":[4692850486,1470085],\"flow_id\":1470085}" ] ] } ] }
补充说明:如果后续需要对日志内部的嵌套JSON字段做检索,可以在Loki查询语句中使用内置的JSON解析器提取字段,不需要也不允许将这类字段提前定义为
stream段的标签。
内容的提问来源于stack exchange,提问作者Shalini
相关产品推荐
相关产品推荐

