JSON日志非标准格式时需逐行解析并安全取值,时间字段须转datetime并去时区,列名需清洗去重,文本型数值列应设为字符串或文本格式。

JSON日志结构不规则时,pandas.read_json() 会报错
直接用 pandas.read_json() 读取日志文件常失败,不是因为语法错,而是日志往往不是标准 JSON 数组(比如每行一个 JSON 对象,即 JSON Lines 格式),或嵌套太深。pandas 默认只认顶层是 list 或 dict 的纯 JSON,而真实日志多为逐行写入的 {"ts":"2024-01-01","level":"INFO","msg":"ok"} 这类。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 先用
open()逐行读取,对每行调用json.loads(),收集为 Python 字典列表 - 遇到字段缺失(如某行没
"duration")就用dict.get("duration", None)避免 KeyError - 若嵌套字段如
log["user"]["id"],别硬写三层索引,改用jsonpath-ng或自定义安全取值函数
时间字段解析失败导致 Excel 里显示为数字或乱码
日志里的 "timestamp": "2024-01-01T09:30:45.123Z" 被 pandas 当成字符串读入后,to_excel() 不会自动识别为时间类型,导出到 Excel 就变成普通文本,排序、筛选、图表全失效。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 读取后立刻用
pd.to_datetime(df["timestamp"], errors="coerce")转列,errors="coerce"把非法值转为NaT,不中断流程 - 导出前设
df["timestamp"] = df["timestamp"].dt.tz_localize(None)去掉时区(Excel 不认带 tz 的 datetime) - 用
ExcelWriter引擎(推荐openpyxl)时,可额外加date_format="yyyy-mm-dd hh:mm:ss"控制单元格格式
字段太多或中文列名导致 Excel 打开报“发现不可读内容”
Excel 对列名长度(超 255 字符)、特殊字符(\ / ? * [ ])、开头数字、重复名极其敏感。日志里若含 "http.request.headers.user-agent" 或 "error.stack_trace" 这类长键名,或原始字段是 "用户ID",直接导出常触发 Excel 兼容警告甚至崩溃。
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 重命名列:用
df.rename(columns=lambda x: re.sub(r"[^a-zA-Z0-9_\u4e00-\u9fa5]", "_", x)[:50])清洗非法字符并截断 - 避免重复:对清洗后列名做
df.columns = pd.io.parsers.ParserBase({"names": df.columns})._maybe_dedup_names()(pandas 内置去重逻辑) - 大字段(如完整 stack trace)不要直接写入 Excel,改存为单独 txt 文件,Excel 表格里只放摘要或哈希值
导出后数值列在 Excel 里显示为科学计数法或左对齐
这是 Excel 自动格式推断惹的祸——它看到 "1234567890123" 这种长数字字符串,会当成数字并转科学计数法;看到带前导零的 ID(如 "00123")又当文本左对齐,但后续无法参与数值计算。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 对明确要当文本的列(如 trace_id、order_no),导出前转成字符串:
df["trace_id"] = df["trace_id"].astype(str) - 用
openpyxl引擎时,可在写入后遍历列,设单元格number_format = '@'(文本格式) - 对真数值列(如耗时毫秒),确保它是
int64或float64类型,且无空字符串混入(空字符串会导致整列变 object 类型)
字段嵌套深、时间格式杂、列名不规范、数值类型模糊——这四点不提前处理,Excel 表格看着生成了,实际用起来全是坑。尤其注意日志里看似一致的字段,在不同服务/版本中可能随时增减或改名,脚本得默认容忍缺失而非报错退出。

















