如何在Fluentd配置文件的index_name字段中设置hostname变量
你当前配置无法生效主要有两个核心原因:
- Fluentd没有默认提供全局的
hostname占位符供输出插件直接调用 - Elasticsearch输出插件默认未开启占位符解析能力,也无法直接读取系统主机名
你可以通过以下两种方案实现需求:
方案1:通过Filter注入主机名字段(适用所有部署场景)
先在你现有的<match output.**>配置之前,新增Filter规则给所有匹配的日志预注入主机名字段:
<filter output.**> @type record_transformer # 可选配置:如果不需要把host字段保留到最终写入ES的日志中,可以开启下面这条 # remove_keys host <record> host "#{Socket.gethostname}" </record> </filter>
然后修改你的Elasticsearch输出配置,开启占位符解析并修改index_name配置:
<match output.**> @type copy <store> @type elasticsearch host elasticsearch ssl_version TLSv1_2 ssl_verify false type_name _doc port 443 scheme https flush_interval 10s # 新增:开启占位符解析 enable_placeholder true # 修改index_name,引用前面注入的host字段 index_name abc-${host} </store> <store> @type stdout </store> </match>
方案2:通过环境变量传递主机名(更简洁,推荐容器部署场景)
启动Fluentd进程前,先将系统主机名注入为环境变量,比如:
- 物理机/虚拟机启动:执行
export HOSTNAME=$(hostname)后再启动Fluentd - Docker启动:启动命令增加参数
-e HOSTNAME=$(hostname) - Kubernetes部署:在Pod的env配置里添加
valueFrom.fieldRef.fieldPath: spec.nodeName即可直接获取节点名
之后直接修改index_name配置即可,不需要新增Filter:
<match output.**> @type copy <store> @type elasticsearch host elasticsearch ssl_version TLSv1_2 ssl_verify false type_name _doc port 443 scheme https flush_interval 10s # 直接引用环境变量,注意必须加双引号 index_name "abc-${ENV['HOSTNAME']}" </store> <store> @type stdout </store> </match>
内容的提问来源于stack exchange,提问作者sunshine
相关产品推荐
相关产品推荐

