JSON、NDJSON 与 GZIP:如何整理能正确恢复的日志
选择日志记录格式,区分字符串内转义换行与真正的记录边界,再通过解压和抽样核对确认归档可恢复。包含两条记录的转换示例。
JSON 数组和逐行记录适合不同任务
JSON 数组把一组记录放在同一个完整文档里;NDJSON 则让每一行分别成为一个完整 JSON 值。选哪一种,应看接收方要求以及你准备怎样查看和处理记录。
把一个带缩进的多行 JSON 对象保存成 .ndjson,并不会让它自动成为逐行记录。Neatbo 的转换会按照所选方向解析结构,错误行需要先修正。
先确认记录边界,再考虑压缩
整理日志时,重要的不是扩展名是否统一,而是转换后能否恢复相同的记录。转换前后的记录数、首尾记录和有嵌套结构的样本,都值得核对。
时间戳、错误堆栈和消息中的换行也要注意。文本中的转义换行与实际分隔记录的换行并不相同,手动按显示行数估算记录量可能产生误判。
GZIP 负责体积,不负责保密
GZIP 是压缩格式,不提供密码保护或加密。将文件压成 .gz 之后,拿到文件的人仍可解压读取;分享前要先处理不应公开的令牌、个人信息和内部地址。
压缩结果也不保证一定更小,尤其是很短或已经压缩过的输入。比较实际大小,然后决定是否值得增加这一层封装。
可恢复,才算归档完成
完成压缩后,解压一份进行检查,核对文本、记录数量和代表性字段。只有文件能下载,并不能证明下游可以正确解析它。
浏览器工具受内存和单次输入限制约束,适合可控规模的本地整理。保留原稿,超出工具限制时不要靠改扩展名绕过检查,应选择适合该规模的处理方式。
两条记录,其中一条消息包含换行
第一条消息中的转义序列属于字符串。转成 NDJSON 后,它仍须保持转义,整条记录才占一个物理行。跨多行缩进的对象属于 JSON,却不是逐行记录格式的 NDJSON。
转换后检查记录仍为两条,并确认解析第一条消息时可以还原其中的换行。GZIP 压缩后解压一份副本,再重复这些检查。这验证结构和可恢复性,但不能证明下游日志服务一定接受所选字段。
对于大量运行日志,浏览器内存和工具限制可能并不适合。应在满足数据规模和访问控制要求的环境中处理,不能通过改文件名绕过限制,也不能因为压缩后很小就认为解码数据处理成本很低。
| 格式 | 组织的内容 | 交接前的问题 |
|---|---|---|
| JSON 数组 | 完整集合 | 接收方是否要求一份完整文档? |
| NDJSON | 每行一个值 | 接收方能否逐行读取记录? |
| GZIP | 压缩后的字节 | 接收方能否先解压再解析? |
{"id":1,"message":"first\nsecond"}
{"id":2,"message":"done"}完成前的检查清单
- 比较记录数量和抽查的标识符。
- 检查嵌套对象和包含换行转义的字符串。
- 分享前移除令牌和不必要的个人数据。
- 接收方确认可以解析后,再决定原稿的留存方式。
参考资料
- NDJSON 格式规范
定义逐行序列化方式;压缩和下游字段要求是独立问题。