如何配置Fluentd采集syslog服务启动前的全量系统日志
问题根因
漏采日志的核心原因有两点:
- 你当前配置的rsyslog转发规则,仅会处理rsyslog服务启动后实时接收到的新日志。服务启动前已经写入
/var/log/syslog磁盘文件的历史日志、内核启动阶段暂存在内核环形缓冲区的早期启动日志,默认不会被主动读取转发。 - Ubuntu默认服务启动顺序中,cron的
@reboot任务触发时间早于rsyslog完成网络转发初始化的时间,这部分任务产生的日志直接落盘到syslog文件,没有经过rsyslog转发流程,自然无法到达fluentd。
配置步骤
1. 调整服务启动优先级,从源头减少漏采
先保证rsyslog、fluentd在cron服务之前启动,避免@reboot任务产生日志时转发链路还没就绪:
- 执行
systemctl edit fluentd(如果部署的是td-agent则替换为systemctl edit td-agent),填入以下配置:
[Unit] Before=cron.service rsyslog.service Wants=rsyslog.service
- 执行
systemctl edit rsyslog,填入以下配置:
[Unit] After=network.target Before=cron.service
- 执行
systemctl daemon-reload重载配置生效。
2. 配置rsyslog启动时主动拉取存量启动日志
仅调整启动顺序无法覆盖内核启动前10秒的日志(这部分日志存在内核环形缓冲区,rsyslog默认不会从头读取),也无法覆盖极端情况下早于rsyslog启动落盘的日志,需要补充模块配置:
- 开启内核日志读取模块,编辑
/etc/rsyslog.conf,在模块加载段添加或取消注释以下配置:
$ModLoad imkmsg $kmsgReadFromStart on
该配置会让rsyslog启动时从内核环形缓冲区起始位置读取所有未消费的内核启动日志,走现有转发规则发送到fluentd。
- 配置rsyslog启动时读取已落盘的syslog存量日志,在你之前存放转发规则的配置文件(比如
/etc/rsyslog.d/90-forward-fluentd.conf)最开头添加以下配置,注意要放在*.* @127.0.0.1:5140这条转发规则之前:
$ModLoad imfile $InputFileName /var/log/syslog $InputFileTag syslog-stored: $InputFileStateFile stat-syslog-stored $InputFileSeverity info $InputFileFacility local7 $InputRunFileMonitor # 启动时仅读取文件末尾10M的存量内容,足够覆盖启动阶段的日志量,避免读取全量历史日志 $InputFileReadFromStart off $InputFileMaxBytesAtStartup 10485760
该配置不会重复发送日志:rsyslog会通过
stat-syslog-stored状态文件记录已经读取过的日志位置,后续运行时会持续实时监控syslog文件追加的新内容,和原生转发流程不冲突。
3. 验证配置
重启服务器后做两项检查:
- 对比
dmesg输出的内核启动日志,确认fluentd侧已全量接收到 - 检查你配置的
@reboot logger this does not get sent to fluentd测试日志,确认fluentd侧可正常查询到 - 如果出现少量重复日志,可以适当调小
$InputFileMaxBytesAtStartup的数值,一般设置为2M~5M即可覆盖普通服务器的启动阶段日志量。
可选简化方案
如果不想修改rsyslog模块配置,也可以直接在fluentd侧补充tail输入源,直接读取/var/log/syslog文件采集全量日志,仅需要额外加一层去重规则,避免rsyslog转发的日志和tail读取的日志重复入库。补充的source配置示例:
<source> @type tail path /var/log/syslog pos_file /var/lib/fluentd/syslog.pos tag system.stored <parse> @type syslog </parse> </source>
内容的提问来源于stack exchange,提问作者Jayen
相关产品推荐
相关产品推荐

