Neatbo.

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 与 JSON 互转 →将逐行日志转为 JSON 数组,或把数组拆成 NDJSON 逐行记录。GZIP 压缩 →把单个日志、文本或数据文件压缩为 .gz,便于传输与归档。GZIP 解压 →还原一个 .gz 或 .gzip 文件并下载原始内容。