grep -c '用户不存在' app.log
python3 -c 'print(b"\u7528\u6237".decode("unicode_escape"))'

线上日志里一条报错写成 {"msg":"\u7528\u6237\u4e0d\u5b58\u5728"},grep 用户不存在 返回 0 行。同一时段有两万多条请求日志,只能靠肉眼一条条翻。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:序列化时开了 ensure_ascii,非 ASCII 字符全被写成 \uXXXX 形式,文件里只剩 ASCII 字节。grep 按原文字节比对,转义后的串和中文对不上,搜不到是必然的。

「日志 unicode 转义」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。监控和日志的时间要对上,时区不一致会多绕很大一圈。

临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

处理上按这个顺序:先确认日志是哪个库写的 找 ensure_ascii 或 JSON_UNESCAPED_UNICODE 开关;输出改成不转义中文 新日志立刻可读;历史日志用 unicode_escape 反解一次再落成新文件;检索脚本同时匹配原文和 \u 编码两种写法。

确认没问题再收工,新写的一条日志里能直接看到中文 grep 命中 1 行。

作者 9823189