🟡 [M9] 非字符串类型的 timestamp/level 字段被静默丢弃 #19

Closed
opened 2026-06-03 13:53:57 +08:00 by dailz · 1 comment
Owner

文件: core/parser/json.rs:127-158
分类: 解析 / 数据丢失

问题: fields.remove(key) 先移除字段,再检查值类型。如果值不是字符串(如 {"level":30}),字段已从 fields 中移除,既不在 level 也不在 fields 中 → 静默数据丢失。

建议修复: 先检查类型,只有成功提取才移除;非字符串值保留在 fields 中。

**文件**: `core/parser/json.rs:127-158` **分类**: 解析 / 数据丢失 **问题**: `fields.remove(key)` 先移除字段,再检查值类型。如果值不是字符串(如 `{"level":30}`),字段已从 `fields` 中移除,既不在 `level` 也不在 `fields` 中 → 静默数据丢失。 **建议修复**: 先检查类型,只有成功提取才移除;非字符串值保留在 `fields` 中。
dailz added the area/parserseverity/mediumbug labels 2026-06-03 13:53:57 +08:00
dailz closed this issue 2026-06-10 10:47:10 +08:00
Author
Owner

已修复,提交 8e9600d。

根因: parse_line 中 fields.remove(key) 在类型检查之前执行,非字符串值(如 {"level":30})被移除后 as_str() 返回 None,导致字段既不在提取结果中也不在 fields 中 → 静默数据丢失。

修复方案:

  • 新增 take_string_field helper:先 get() 检查类型,确认为字符串后才 remove() 取出 owned String
  • 非字符串值保留在 fields 中,候选键继续尝试下一个
  • 新增 4 个测试覆盖数字值场景

行为变更:

输入 修复前 修复后
{"level":30} level=None, 字段丢失 level=None, fields 保留 {"level":30}
{"level":30,"lvl":"INFO"} level=None, 两个 key 都丢 level=Info, fields 保留 {"level":30}
{"timestamp":1718000000} timestamp=None, 字段丢失 timestamp=None, fields 保留 {"timestamp":1718000000}
已修复,提交 8e9600d。 **根因**: parse_line 中 fields.remove(key) 在类型检查之前执行,非字符串值(如 {"level":30})被移除后 as_str() 返回 None,导致字段既不在提取结果中也不在 fields 中 → 静默数据丢失。 **修复方案**: - 新增 take_string_field helper:先 get() 检查类型,确认为字符串后才 remove() 取出 owned String - 非字符串值保留在 fields 中,候选键继续尝试下一个 - 新增 4 个测试覆盖数字值场景 **行为变更**: | 输入 | 修复前 | 修复后 | |------|--------|--------| | {"level":30} | level=None, 字段丢失 | level=None, fields 保留 {"level":30} | | {"level":30,"lvl":"INFO"} | level=None, 两个 key 都丢 | level=Info, fields 保留 {"level":30} | | {"timestamp":1718000000} | timestamp=None, 字段丢失 | timestamp=None, fields 保留 {"timestamp":1718000000} |
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: dailz/logViewer#19