生产环境应优先使用td-agent而非gem install fluentd,因其自带ruby运行时、预编译插件、systemd服务模板及受控版本更新;裸安装易致依赖冲突、插件编译失败与系统ruby污染。

fluentd 不是“装上就能用”的工具,它依赖明确的角色划分:中心采集端(接收、路由、转发)和客户端代理(收集本机日志并发送)。直接在所有机器上跑全功能 fluentd 容易导致配置冗余、资源浪费、时间戳错乱。生产环境应优先使用 td-agent(Treasure Data 官方打包版),而非裸 gem install fluentd。
用 td-agent 而不是 gem install fluentd
td-agent 是为生产环境定制的 Fluentd 发行版:自带 Ruby 运行时、预编译插件、systemd 服务模板、默认日志轮转,且版本更新受控。裸 gem install fluentd 会污染系统 Ruby 环境,插件编译失败率高,升级后常因依赖冲突崩溃。
-
Debian/Ubuntu:
curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-focal-td-agent4.sh | sh
(注意:2026 年主流发行版已推荐 td-agent 4.x,对应 Fluentd v1.16+) -
RHEL/CentOS 8+:
curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent4.sh | sh
安装后,主配置文件固定为
/etc/td-agent/td-agent.conf,日志路径为/var/log/td-agent/td-agent.log,服务名是td-agent,不是fluentd。切勿手动
gem install fluent-plugin-elasticsearch;应统一用td-agent-gem install fluent-plugin-elasticsearch,否则插件无法被td-agent加载。
syslog 输入必须显式启用 TCP + bind 地址
@type syslog 插件默认只监听 UDP 514,而 UDP 易丢包、无连接状态、难做防火墙策略。生产中必须强制走 TCP,并绑定具体网卡地址。
常见错误配置:
<source> @type syslog port 514 </source>
这会导致服务启动成功但收不到日志——因为默认 bind 是 127.0.0.1,且未启用 TCP 模块。
正确写法:
<source> @type syslog port 514 bind 0.0.0.0 protocol_type tcp # 必须加这一行,否则仍只走 UDP </source>
- 若服务器有多个网卡,把
0.0.0.0换成内网 IP(如192.168.1.100),避免暴露到公网; - 防火墙需放行 TCP 514:
sudo ufw allow 514/tcp(Ubuntu)或sudo firewall-cmd --add-port=514/tcp --permanent && sudo firewall-cmd --reload(RHEL); - 启动后验证监听:
sudo ss -tlnp | grep :514,输出中应含td-agent进程。
输出到 Elasticsearch 必须指定 index_name 和 logstash_format
fluent-plugin-elasticsearch 的默认行为是把所有日志打到一个 index(如 logstash-2026.05.22),且字段名带 @ 前缀(如 @timestamp),这与 Kibana 的默认索引模式不兼容。
典型错误配置:
<match> @type elasticsearch host 192.168.1.200 port 9200 </match>
结果是日志能进 ES,但 Kibana 找不到 timestamp 字段,图表全空。
正确配置要点:
- 必须设
logstash_format true,让字段名变成timestamp、message、host; - 必须设
logstash_prefix fluentd(或其他自定义前缀),避免和 Logstash 冲突; - 必须设
index_name fluentd-%Y.%m.%d,启用日期滚动; - 推荐加
include_tag_key true和tag_key @log_name,方便按来源过滤。
示例:
<match> @type elasticsearch host 192.168.1.200 port 9200 logstash_format true logstash_prefix fluentd index_name fluentd-%Y.%m.%d include_tag_key true tag_key @log_name request_timeout 15s </match>
时间同步失效会让日志顺序彻底混乱
Fluentd 默认用系统时间打 time 字段,若各节点 NTP 不同步,同一秒内产生的日志在 ES 中可能跨两天、排序颠倒。这不是配置问题,是基础设施缺陷。
- 所有运行
td-agent的机器必须运行 NTP 客户端,且systemctl status ntpd或systemctl status chronyd显示 active (running); - 检查偏移量:
ntpq -p输出中offset应在 ±50ms 内; - 若用
chrony(RHEL 8+/CentOS Stream 默认),确认/etc/chrony.conf包含有效上游服务器,如:server ntp.aliyun.com iburst; -
td-agent本身不校正时间,它只忠实地记录当时系统给出的时间戳。
最易被忽略的一点:Docker 容器内运行 td-agent 时,宿主机 NTP 正常 ≠ 容器内时间同步。需挂载宿主机 /etc/localtime 并确保容器内也运行 chronyd 或通过 --network=host 复用宿主机网络栈。











