You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 16:45:04