日志采集报 parse error: invalid character '\x00' looking for beginning of value,原始行里订单备注带了一个空字符,整条日志被丢弃。日志里能对上时间点,这种反而好排。
上游把用户输入原样拼进 JSON,NUL 或其它控制字符没有转义,序列化出来的行不是合法 JSON。采集端按行解析,一处坏字符整行作废。这一点先确认清楚,后面就不用反复试。
python -c "import re; print(re.sub(r'[\x00-\x1f]', '', open('app.log', encoding='utf-8').read()))"
tail -f app.log | jq .
grep -P '\x00' app.log | wc -l
「日志空字符」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。
别只看报错的最后一行,往上看几行,真正的起因通常在上面。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
处理上按这个顺序:写入前过滤 U+0000 到 U+001F 的控制字符;用结构化日志库 让它负责转义;采集端解析失败时保留原文到死信文件;对备注类字段单独做清洗再入库。
结果对不对很好判断,新日志里不再出现空字符 采集端解析成功率回到 100%。
