如何正确使用 Rsyslog 的 imfile 模块解析文本文件?

通过 rsyslog 的 imfile 模块可以采集普通文本日志文件并打进 syslog 管道。本文给出 RainerScript 风格的完整配置、状态文件说明及排错要点,并对比观测云 DataKit 的文件日志采集方案。

最佳实践
如何正确使用 Rsyslog 的 imfile 模块解析文本文件?封面

核心步骤:加载 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 做行合并。

常见坑

  1. SELinux/权限:rsyslog 进程读不到目标文件是最常见的问题,检查文件权限和 SELinux 上下文。
  2. 日志轮转:文件被 logrotate 移走后,需要配置 reopenOnTruncate="on" 或确保轮转工具发 HUP 信号。
  3. 多行堆栈被拆散:不配置多行合并时,Java 异常堆栈的每一行都会成为独立日志。

观测云对照

如果采集文本文件日志是最终目的,观测云 DataKit 的日志采集器可以直接完成这项工作:指定文件路径即可实时采集上报,支持多行日志合并、自动处理轮转,无需维护 rsyslog 规则和状态文件;日志到达观测云后还能用 Pipeline 做 grok 解析与字段提取。

常见问题(FAQ)

Q:imfile 会重复采集已有内容吗?
A:首次启动默认从文件末尾开始读(freshStartTail 行为因版本而异);有状态文件时从上次偏移继续。需要全量采集历史内容可设置 startmsg.regex 相关参数或删除状态文件后重启。

Q:采集后消息里的换行不见了?
A:imfile 按行读取,每行是一条独立消息。需要保留多行结构必须配置多行合并。

Q:能直接转发到远程 syslog 服务器吗?
A:可以,把路由规则换成 *.* @@remote-host:514(TCP)即可,imfile 采集的消息同样走转发队列。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台