Fluent Bit 如何把 JSON 日志拆分成 Elasticsearch 的结构化字段?
Fluent Bit 用 json parser 解析日志行,嵌套对象用 Nest 过滤器的 Operation lift 提升到顶层;输出到 ES 后字段即结构化可检索。本文给出 parser 与 nest 过滤器的完整配置。
两步:input 或 filter 用 PARSER json 把 JSON 行解析成字段;嵌套对象可按需用 Nest 的 lift 提到顶层;普通对象字段本就可按点路径检索,能否聚合取决于映射类型,不要求扁平化。
配置示例
解析器放在独立的 parsers.conf:
[PARSER]
Name json_parser
Format json
主配置引用解析器文件:
[SERVICE]
Parsers_File parsers.conf
[INPUT]
Name tail
Path /var/log/app/*.log
Parser json_parser
[FILTER]
Name nest
Match *
Operation lift
Nested_under request
Add_prefix request_
[OUTPUT]
Name es
Match *
Host elasticsearch
Index app-logs
Suppress_Type_Name On
原始 {"request":{"method":"GET","path":"/api"}} → ES 文档含顶层 request_method、request_path 字段。
Suppress_Type_Name On 适用于 Elasticsearch 8+ 的无 mapping type 接口;生产连接还需按实际配置 TLS 和认证。Tail 可配置持久化 DB 保存读取位置。
反向操作:nest
Operation nest 把散字段收进一个子对象——适合输出需要特定结构的场景。
常见问题(FAQ)
Q:字段提升后与现有字段重名怎么办? lift 前用 nest 把原字段收拢,或重命名。
Q:ES 里字段类型不对(数字成字符串)? 用 filter 中的类型转换插件,或让应用端输出正确类型的 JSON。