如何配置FluentBit与OpenSearch正确处理JSON及非JSON日志
解决方案:多语言K8s日志解析与OpenSearch展示优化
1. FluentBit配置调整(解决JSON日志解析失败与两类日志正常展示)
核心思路
先清理log字段中的前缀内容,再尝试解析JSON;解析失败时保留原文本,确保非JSON日志不受影响。
主配置(fluent-bit.conf)
[SERVICE] Flush 1 Log_Level info [INPUT] Name tail Path /var/log/containers/*.log Parser docker Tag kube.* Mem_Buf_Limit 5MB Skip_Long_Lines On Refresh_Interval 10 # 第一步:移除log字段中的前缀(根据实际前缀格式调整正则) [FILTER] Name parser Match kube.* Parser log_prefix_cleaner Key_Name log Reserve_Data On Preserve_Key Off # 用清理后的日志内容替换原log字段 # 第二步:尝试解析JSON,失败则保留原文本 [FILTER] Name parser Match kube.* Parser json Key_Name log Reserve_Data On Ignore_Error On # 解析失败时不丢弃日志,保留原内容 Preserve_Key On # 保留原始log字段,同时将JSON字段提取到根级别 [OUTPUT] Name opensearch Match kube.* Host <你的OpenSearch域名> Port 443 Index k8s-logs-%Y.%m.%d AWS_Auth On AWS_Region <你的AWS区域> TLS On TLS_Verify On Retry_Limit 3
自定义前缀清理Parser(添加到parsers.conf)
根据实际前缀格式调整正则,比如常见的Python/Go日志前缀:
[PARSER] Name log_prefix_cleaner Format regex # 匹配类似"2024-05-20 14:30:00 INFO [app] "的前缀,提取后面的实际日志内容 Regex ^(?<timestamp>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) (?<level>[A-Z]+) \[(?<service>[^\]]+)\] (?<log>.*)$ Time_Key timestamp Time_Format %Y-%m-%d %H:%M:%S
2. OpenSearch log字段是否需要设置为dynamic类型?
不需要修改log字段的类型,原因如下:
- OpenSearch默认索引配置
dynamic: true,会自动为解析出的JSON字段创建映射; log字段本身存储的是原始日志文本(无论是否解析成功),保持text类型即可满足非JSON日志的搜索需求;- 如果你的索引手动设置了
dynamic: strict,则需要改为dynamic: true,否则新增的JSON字段会被丢弃。
3. 处理JSON组件偶发的非JSON错误日志
通过在JSON解析Filter中设置Ignore_Error On即可解决:
- 当组件输出非JSON内容时,FluentBit会跳过解析,直接将原始日志转发到OpenSearch;
- 这些日志会以普通文本形式展示在OpenSearch中,不会丢失或报错。
内容的提问来源于stack exchange,提问作者MattG
相关产品推荐
相关产品推荐

