服务器 Fluentd 教程:从安装到日志转发验证
服务器 Fluentd 教程:从安装到日志转发验证
如果你的服务器上散落着 Nginx、应用和系统日志,想统一收集再转发到 Elasticsearch、Kafka 或对象存储,Fluentd 是常用选择之一。
这篇教程按零基础可照做的顺序,讲清在 Linux 服务器上安装 Fluentd、写最小可用配置、验证日志是否成功转发的完整过程,并给出常见报错的处理思路。
Fluentd 是一个用 Ruby 写的日志采集与转发工具,官方为 Linux 提供了打包好的发行版 td-agent,它自带 Ruby 运行时和常用插件,适合不想手动处理依赖的新手。
本文以 td-agent 为例,适用于主流的 RPM 系(如 CentOS、Rocky Linux)和 DEB 系(如 Ubuntu、Debian)发行版。
安装前需要确认的三件事
安装前先确认环境,可以避免大部分“装完启动不了”的问题。
- 系统架构:执行
uname -m,输出x86_64或aarch64,确认有对应的安装包。 - 内存与磁盘:Fluentd 本身占用不大,但缓冲队列会写磁盘,建议
/var/log所在分区保留至少 1GB 可用空间,用df -h查看。 - 时间同步:日志时间戳错乱会导致后续检索困难,执行
timedatectl status确认系统时间正常,必要时开启 NTP。
注意:不要直接使用系统包管理器里的 fluentd 包,版本可能较旧且插件不全,优先使用官方 td-agent 仓库。
在服务器上安装 td-agent
以下命令需要 root 权限或 sudo。
不同发行版的仓库脚本不同,请按你的系统选择。
RPM 系(CentOS / Rocky / AlmaLinux)
curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent4.sh | sh
DEB 系(Ubuntu / Debian)
curl -L https://toolbelt.treasuredata.com/sh/install-debian-bookworm-td-agent4.sh | sh
脚本会自动添加仓库并安装 td-agent。
安装完成后,用下面的命令确认版本和服务状态:
td-agent --version
systemctl status td-agent
如果 systemctl status 显示 active (running),说明服务已正常启动。
此时 td-agent 已带有一份默认配置,位置在 /etc/td-agent/td-agent.conf。
写一份最小可用的转发配置
默认配置只是把日志打印到本地,我们先改成一个能实际验证的转发任务:读取一个测试日志文件,把内容输出到另一个文件。
这样不依赖外部服务,方便确认链路是否通。
编辑配置文件:
vi /etc/td-agent/td-agent.conf
将内容替换为以下配置(注意保留缩进,Fluentd 配置对缩进不敏感,但 @ 开头的指令必须写对):
@type tail
path /var/log/myapp/test.log
pos_file /var/log/td-agent/test.log.pos
tag myapp.test
@type none
@type file
path /var/log/td-agent/output
flush_mode interval
flush_interval 5s
这段配置做了两件事:
source部分用tail插件持续读取/var/log/myapp/test.log,每读一行打上myapp.test标签。match部分把带该标签的日志写入/var/log/td-agent/output目录下的文件,每 5 秒刷新一次缓冲。
这里有一个容易忽略的前提:/var/log/myapp/test.log 必须真实存在,且 td-agent 运行用户(通常是 td-agent)有读取权限。
可以先用下面命令创建并授权:
mkdir -p /var/log/myapp
touch /var/log/myapp/test.log
chown -R td-agent:td-agent /var/log/myapp
重载配置并验证数据是否真的转发成功
改完配置后不要直接重启服务,先检查语法,避免配置错误导致服务起不来:
td-agent --dry-run -c /etc/td-agent/td-agent.conf
如果没有报错,再重载服务:
systemctl restart td-agent
然后向测试日志写入几行内容,观察输出文件:
echo "hello fluentd" >> /var/log/myapp/test.log
sleep 6
ls -l /var/log/td-agent/output/
cat /var/log/td-agent/output/*.log
如果能在输出文件里看到 hello fluentd,说明采集和转发链路已经通了。
如果输出目录没有文件,按下面的顺序排查:
- 查看 td-agent 自身日志:
tail -f /var/log/td-agent/td-agent.log,关注是否有Permission denied或no such file。 - 确认
pos_file路径可写,默认放在/var/log/td-agent/下,权限应属于td-agent用户。 - 检查
path指向的文件是否被日志轮转(logrotate)改名,tail 插件依赖 pos_file 记录读取位置,轮转后需配合rotate_wait参数。
几个真实的踩坑点
缓冲目录写满导致丢日志。
Fluentd 的 file 和 forward 插件默认会在磁盘缓冲,如果下游服务长时间不可用,缓冲会持续增长。
建议在 buffer 段设置 total_limit_size,例如 total_limit_size 512MB,避免占满磁盘。
配置文件里用了不存在的插件。
Fluentd 插件需要单独安装,使用 td-agent-gem install fluent-plugin-xxx 安装后重启服务。
不要假设所有 @type 都内置。
时间字段格式不一致。
如果下游是 Elasticsearch,注意 @type elasticsearch 插件对时间字段的解析要求,必要时在 filter 段用 record_transformer 统一时间格式,否则会出现索引日期错乱。
常见疑问
Fluentd 和 Fluent Bit 该选哪个? 两者同源,Fluent Bit 更轻量、资源占用低,适合边缘节点或容器;
Fluentd 插件生态更丰富,适合中心聚合和复杂路由。
服务器上做日志统一收集,两者都常见,按资源预算和插件需求决定。
td-agent 和 fluentd 命令有什么区别? td-agent 是官方打包发行版,命令前缀为 td-agent,配置文件默认在 /etc/td-agent/。
手动 gem 安装的 fluentd 命令和路径不同,本文以 td-agent 为准,不要混用两套路径。
修改配置后一定要重启吗? Fluentd 支持通过 kill -HUP 或 systemctl reload td-agent 重载部分配置,但涉及插件加载和 source 变更时,重启更稳妥。
生产环境建议先 --dry-run 验证再重载。
日志转发延迟很高怎么办? 检查 flush_interval 设置,默认可能较长;
网络链路和下游写入速度也会影响。
先用小流量测试确认是采集端还是下游瓶颈,再调整缓冲和刷新参数。
收尾建议
完成本文的最小转发示例后,你可以把 match 段替换为 forward 插件指向远端 Fluentd,或换成 elasticsearch、kafka 等输出插件。
每次改配置都先 --dry-run,再重载,再写入测试数据验证,这套流程能帮你快速定位是配置问题还是下游问题。