Fluentd 输出到文件时如何做日志轮转(Rotation)?
Fluentd 的 out_file 通过 time slice 按时间切片输出(如 path /var/log/agg/app.%Y%m%d)自然实现按天轮转;配合 buffer timekey 控制粒度。本文给出配置与压缩归档建议。
Fluentd 的 out_file 本身不做传统意义的轮转,而是靠时间切片路径实现等效效果:buffer 按时间分块,输出路径带时间占位符,每小时/每天一组文件——天然轮转,不需要 logrotate。
配置示例
<match app.**>
@type file
path /var/log/fluentd-agg/app.%Y-%m-%d.%H
append true
<buffer time>
timekey 1h # 每小时一个文件
timekey_wait 10s
timekey_use_utc true
path /var/log/fluentd-buf/app
</buffer>
<format>
@type json
</format>
</match>
效果:app.2024-01-15.10.log、app.2024-01-15.11.log……按 UTC 小时切片,append true 将同一切片的 chunk 追加到同一文件;默认 append false 会产生带索引的分文件,默认后缀为 .log。改 timekey 1d + 路径 %Y-%m-%d 即按天轮转。
压缩与清理
- 输出端直接压缩:在
<match>的输出层设置compress gzip;它与 buffer 压缩不是同一个层级; - 历史文件清理由 logrotate 或限定文件模式并先预览:
find /var/log/fluentd-agg -maxdepth 1 -type f -name "app.*.log*" -mtime +30 -print,核对后再将-print换为-delete负责。
常见问题(FAQ)
Q:timekey_wait 是什么? 等待迟到日志的宽限——时间切片结束后等待 10s 再刷出;更晚到达的事件仍可能产生同一时间段的新 chunk,不能保证此后文件永不变化。
Q:能按大小轮转吗? out_file 不直接支持;按时间切片是官方推荐模式,chunk_limit_size 约束 buffer chunk,而非最终文件大小;append true 会继续追加,不能据此限制成品文件大小。