如何配置Fluent-bit拆分JSON日志字段并写入Elasticsearch?
解决Fluent-bit解析嵌套JSON并提取顶层字段问题
日志示例
原始应用日志格式如下:
{ "@timestamp": "2020-12-24T12:16:43.2784Z", "level": "INFO", "category": "HTTP:Request/Response", "data": "{\"HttpMethod\":\"POST\",\"Accept-Encoding : gzip\",\"Cache-Control : max-age=259200\",\"Content-Type : application/json\",\"Content-Length : 569\",\"X-Forwarded-Port : 443\"}", "identifier": "4c1d2e8d-7585-4a63-abd6-75b4d2a400de" }
当前Fluent-bit配置
[SERVICE] parsers_file parsers.conf plugins_file plugins.conf [FILTER] Name parser Parser json Match * Key_Name data Reserve_Data on Preserve_Key on
期望效果
希望将data字段中的属性提取为顶层字段,最终日志结构如下:
{ "@timestamp": "2020-12-24T12:16:43.2784Z", "level": "INFO", "category": "HTTP:Request/Response", "HttpMethod": "POST", "Accept-Encoding": "gzip", "Cache-Control": "max-age=259200", "Content-Type": "application/json", "Content-Length": "569", "X-Forwarded-Port": "443", "identifier": "4c1d2e8d-7585-4a63-abd6-75b4d2a400de" }
问题分析
当前配置无法生效的核心原因有两个:
data字段内的JSON不符合标准格式:键名与冒号之间存在空格(如Accept-Encoding : gzip),标准JSON解析器无法正确识别这类键值对;Preserve_Key设为on会保留原始data字段,且未将解析后的嵌套字段提升至顶层。
解决方案
修改Fluent-bit配置,添加字符串替换、解析、字段提升三个过滤步骤:
[SERVICE] parsers_file parsers.conf plugins_file plugins.conf # 第一步:清理data字段内的非标准格式,将" : "替换为":" [FILTER] Name modify Match * Add data_cleaned ${data} Replace data_cleaned / : / /:/g # 第二步:解析清理后的标准JSON字符串 [FILTER] Name parser Match * Parser json Key_Name data_cleaned Reserve_Data on Preserve_Key off # 不保留临时的data_cleaned字段 # 第三步:将解析后的嵌套字段提升至顶层 [FILTER] Name nest Match * Operation lift Nested_under data_cleaned Add_prefix ""
配置说明
- modify过滤器:创建
data_cleaned临时字段,替换其中的空格冒号为标准冒号,将非标准JSON转为可解析的格式; - parser过滤器:解析
data_cleaned字段为结构化JSON,关闭Preserve_Key避免保留临时字段; - nest过滤器:将
data_cleaned下的所有子字段直接提升至日志顶层,完成字段扁平化。
内容的提问来源于stack exchange,提问作者void
相关产品推荐
相关产品推荐

