Plainnotes

日志里混进非法 JSON,采集器直接丢

2024-06-22 · 2 分钟工具

结构化日志上线后,采集端偶尔报解析错误,丢一批日志。原因是消息字段里带了换行或者双引号,序列化时没转义。

{"msg": "failed:
connection reset"}

这不是合法 JSON。正确做法是用 JSON 库序列化整个对象,不要手拼字符串:

json.dumps({"msg": msg, "ts": ts})

如果是日志框架,确认 encoder 是 JSON 而不是 pattern,并且异常堆栈作为字符串字段而不是多行文本。

另一个常见问题:日志里有非 UTF-8 字节(比如二进制内容),JSON 编码会失败。要么用 base64,要么在入库前过滤。

采集端可以做兜底:解析失败的行原样保留到 _raw 字段,至少不丢。