如何在Fluent-bit中解析log字段字符串内的嵌套JSON?
解决Fluent-bit解析嵌套JSON日志的问题
要提取smplog::后的嵌套JSON并解析,只需在现有Fluent-bit配置中添加两个过滤器,先提取目标JSON字符串,再将其解析为结构化字段并合并到日志中。
修改fluent-bit.conf
在[FILTER] kubernetes块之后,添加以下两个过滤器:
# 第一步:提取smplog::后的JSON字符串到smplog_json字段 [FILTER] Name regex Match kube.* Regex log ^.*smplog::(?<smplog_json>\{.*\})$ # 仅匹配包含smplog::的日志行,捕获其后的JSON内容 # 第二步:解析smplog_json字段为结构化数据,并合并到根字段 [FILTER] Name parser Match kube.* Parser json Key_Name smplog_json Preserve_Key Off # 解析后删除原始smplog_json字段 Merge_Key On # 将解析出的字段合并到日志根节点
验证配置
- 重启Fluent-bit应用新配置
- 通过stdout输出查看解析结果,确认
application、abc、version等字段已被提取为独立的结构化字段
如果日志中smplog::后的JSON存在换行,可将第一个regex过滤器替换为Lua脚本处理多行场景:
[FILTER] Name lua Match kube.* Script extract_smplog.lua Call extract_smplog_json
对应的extract_smplog.lua脚本内容:
function extract_smplog_json(tag, timestamp, record) local log = record.log if log then local start_idx = string.find(log, "smplog::") if start_idx then local json_str = string.sub(log, start_idx + 8) -- 跳过"smplog::" local ok, json_data = pcall(cjson.decode, json_str) if ok then -- 将解析后的JSON合并到原记录 for k, v in pairs(json_data) do record[k] = v end return 2, timestamp, record end end end return 0, timestamp, record end
内容的提问来源于stack exchange,提问作者SolidQ
相关产品推荐
相关产品推荐

