如何正确使用 Rsyslog 的 imfile 模块解析文本文件?
通过 rsyslog 的 imfile 模块可以采集普通文本日志文件并打进 syslog 管道。本文给出 RainerScript 风格的完整配置、状态文件说明及排错要点,并对比观测云 DataKit 的文件日志采集方案。
核心步骤:加载 imfile 模块 → 用 input(type="imfile" File="..." Tag="...") 声明要监听的文件 → 用规则把带该 Tag 的消息路由到目标位置。关键点是配置状态文件(StateFile)记录读取偏移,避免重启后重复采集或漏采。
配置示例(RainerScript 新语法)
在 /etc/rsyslog.d/ 下新建配置:
module(load="imfile")
input(type="imfile"
File="/var/log/myapp/app.log"
Tag="myapp"
Severity="info"
Facility="local0")
# 路由到本地文件(也可改为转发到远程)
if $programname == 'myapp' then /var/log/myapp-collected.log
& stop
改完执行 rsyslogd -N1 检查语法,然后 systemctl restart rsyslog。
关键参数说明
- File:监听的文件路径,支持通配符(需较新版本)。
- Tag:给这批消息打上的标签,后续靠
$programname过滤。 - StateFile:旧语法中必须显式指定,记录读取偏移;新语法默认在工作目录自动维护,但生产环境建议确认
workDirectory已设置(global(workDirectory="/var/spool/rsyslog"))。 - readMode:默认按行读;多行日志(如 Java 堆栈)需要设置
readMode="0"配合startmsg.regex做行合并。
常见坑
- SELinux/权限:rsyslog 进程读不到目标文件是最常见的问题,检查文件权限和 SELinux 上下文。
- 日志轮转:文件被 logrotate 移走后,需要配置
reopenOnTruncate="on"或确保轮转工具发 HUP 信号。 - 多行堆栈被拆散:不配置多行合并时,Java 异常堆栈的每一行都会成为独立日志。
观测云对照
如果采集文本文件日志是最终目的,观测云 DataKit 的日志采集器可以直接完成这项工作:指定文件路径即可实时采集上报,支持多行日志合并、自动处理轮转,无需维护 rsyslog 规则和状态文件;日志到达观测云后还能用 Pipeline 做 grok 解析与字段提取。
常见问题(FAQ)
Q:imfile 会重复采集已有内容吗?
A:首次启动默认从文件末尾开始读(freshStartTail 行为因版本而异);有状态文件时从上次偏移继续。需要全量采集历史内容可设置 startmsg.regex 相关参数或删除状态文件后重启。
Q:采集后消息里的换行不见了?
A:imfile 按行读取,每行是一条独立消息。需要保留多行结构必须配置多行合并。
Q:能直接转发到远程 syslog 服务器吗?
A:可以,把路由规则换成 *.* @@remote-host:514(TCP)即可,imfile 采集的消息同样走转发队列。