如何在Fluent Bit中基于日志字段生成OpenSearch动态索引?
解决方案
问题原因
Fluent Bit的Logstash_Prefix参数不支持直接引用日志中的字段变量,会将$community当作字符串字面量处理,导致索引名不符合预期。
可行方案:使用Lua过滤器动态生成索引名
通过Lua过滤器从日志字段中提取community值,结合日期拼接成目标索引名,再在OpenSearch输出中引用该自定义字段。
步骤1:添加Lua过滤器配置
在你的fluent-bit.conf中,在[INPUT]之后、[OUTPUT]之前添加以下过滤器配置:
[FILTER] Name lua Match haproxy call set_target_index script /fluent-bit/etc/index_generator.lua
步骤2:编写Lua脚本文件
创建/fluent-bit/etc/index_generator.lua文件,内容如下:
function set_target_index(tag, timestamp, record) -- 从日志记录中获取community字段,不存在则用default兜底 local community = record["community"] or "default" -- 利用日志时间戳生成YYYYMM格式的日期 local date_str = os.date("%Y%m", timestamp) -- 拼接目标索引名并写入新字段 record["target_index"] = "my-index-" .. community .. "-" .. date_str -- 返回修改后的记录(2代表保留tag和timestamp,仅修改record) return 2, timestamp, record end
步骤3:修改OpenSearch输出配置
注释掉原有的Logstash格式相关配置,改用动态索引引用:
[OUTPUT] Name opensearch Match haproxy Host ... Port ... Path ... HTTP_User ... HTTP_Passwd ... # 注释掉原Logstash相关配置 # Logstash_Format On # Logstash_Prefix my-index-$community # Logstash_Prefix_Separator - # Logstash_DateFormat %Y%m # 引用Lua生成的目标索引名字段 Index ${record:target_index} tls on tls.ca_file ... Retry_Limit False Suppress_Type_Name On Workers 4
替代方案:使用record_modifier+inline Lua(简化版)
如果不想单独写Lua脚本,也可以结合record_modifier过滤器添加字段,再用inline Lua处理日期(需Fluent Bit 1.9+支持):
[FILTER] Name record_modifier Match haproxy # 拼接community部分 Record index_prefix my-index-${record:community} # 用inline Lua生成YYYYMM日期,优先用日志时间戳,无则用系统时间 Lua_Record index_date os.date("%Y%m", record["timestamp"] or os.time()) # 拼接最终索引名 Record target_index ${record:index_prefix}-${record:index_date} [OUTPUT] # ... 其他配置 ... Index ${record:target_index} # ... 其他配置 ...
内容的提问来源于stack exchange,提问作者Daniel Portovedo
相关产品推荐
相关产品推荐

