Rsyslog 详解:Linux 系统日志的底层引擎
Rsyslog 中文详解:facility 与 priority 概念、/etc/rsyslog.conf 选择器与动作、模板(template)自定义格式、imfile 模块采集文件、omfwd 转发(TCP/UDP/RELP)、队列与高可靠配置,以及观测云 DataKit syslog 接入方案。
Rsyslog 是几乎所有 Linux 发行版的默认 syslog 守护进程——你系统里 /var/log 下的大部分文件都流经它。它既是系统日志的底层引擎,也是性能强悍的通用日志路由器。本文讲清其核心概念与配置,为系统级日志治理打底。
核心要点速览
- facility × priority 是 syslog 的分类体系:facility 表来源(auth/kern/mail/local0…),priority 表严重级别(debug…emerg)。
- 选择器 + 动作 = 路由规则:
auth.* /var/log/auth.log一行就是一条完整路由。 - imfile 模块让 Rsyslog 能采任意文件——从系统日志引擎变身通用采集器。
- 集中接收:发送与接收端需匹配协议、端口和解析规则,再测试断连后的补发。
1. facility 与 priority:syslog 的二维分类
| Facility | 来源 | Priority | 级别 |
|---|---|---|---|
| auth/authpriv | 认证相关 | emerg | 系统不可用 |
| kern | 内核 | alert/crit | 严重 |
| 邮件系统 | err | 错误 | |
| daemon | 守护进程 | warning | 警告 |
| user | 用户进程 | notice | 注意 |
| local0-7 | 自定义(应用用) | info / debug | 信息/调试 |
应用对接 syslog 时用 logger -p local0.info "msg" 或在代码中用 openlog 指定 facility——local0-7 就是为应用预留的自定义通道。
2. 配置文件解剖
# /etc/rsyslog.conf 及 /etc/rsyslog.d/*.conf
# 选择器 动作
auth,authpriv.* /var/log/auth.log # 认证日志
*.err /var/log/errors.log # 所有 err 及以上
mail.* -/var/log/mail.log # - 表示异步写入(不每条刷盘)
kern.* @@log-center.example.com:514 # @@ TCP 转发,@ UDP
现代格式(RainerScript)表达力更强:
if ($programname == 'nginx' and $syslogseverity <= 4) then /var/log/nginx-error.log
& stop
stop 阻止继续匹配后续规则——避免一条日志进多个文件。
3. 模板:自定义输出格式
template(name="JsonFormat" type="list") {
constant(value="{\"time\":\"") property(name="timereported" dateFormat="rfc3339")
constant(value="\",\"host\":\"") property(name="hostname")
constant(value="\",\"msg\":\"") property(name="msg" format="json")
constant(value="\"}\n")
}
action(type="omfile" file="/var/log/app.json" template="JsonFormat")
模板把日志属性格式化成任意输出——包括直接输出 JSON(平台采集友好)。
4. imfile:采集任意文件
module(load="imfile")
input(type="imfile"
File="/var/log/myapp/*.log"
Tag="myapp:"
Severity="info"
Facility="local0")
应用日志文件被读入 syslog 流,之后可以走本机落盘、转发等一切规则——老系统里 imfile + 转发就是最早的"日志采集器"。
5. 队列与高可靠
action(type="omfwd" Target="log-center" Port="514" Protocol="tcp"
queue.type="LinkedList" queue.filename="fwd" queue.saveOnShutdown="on"
action.resumeRetryCount="-1") # 无限重试
动作级队列 + 磁盘辅助 + 无限重试:中心不可达时本地排队,恢复后补发。RELP 协议(omrelp)进一步提供传输层确认,比裸 TCP 更可靠。
验证 Rsyslog 转发结果
将日志发送到观测云时,按 Syslog 接入说明开启 DataKit 日志采集器的 TCP 或 UDP 监听,再使 Rsyslog 转发目标与其一致。发送一条含唯一标识的测试消息,核对主机名、程序名、时间和 severity 是否按预期解析。
接着模拟接收端暂时不可达,检查前文的动作队列是否积压、恢复后是否补发。文件采集是另一条入口,需另外验证轮转和续读,不能仅凭正常时收到一条消息判断两种方案等价。
常见问题(FAQ)
Rsyslog 和 syslog-ng、journald 什么关系?
三者都是 syslog 实现/体系:rsyslog 是多数发行版默认;syslog-ng 是另一实现;systemd 的 journald 管二进制日志并默认转发给 rsyslog(或并存)。现代系统常是 journald + rsyslog 组合。
转发用 UDP、TCP 还是 RELP?
可靠性排序:RELP > TCP > UDP。机房内 UDP 轻快但可丢;跨网络一律 TCP 起步,关键日志上 RELP 或文件采集方案。
为什么我的 imfile 重复采集了?
状态文件(StateFile)丢失或路径变了。imfile 靠 state 文件记录位点,确保其目录持久化,且通配符匹配的文件路径稳定。
Rsyslog 性能怎么样?
非常强——C 实现、百万 EPS 级别的成熟案例不少。它的问题不在性能而在配置生态老化;新需求优先评估现代采集器或 DataKit。
系列阅读
- 上一篇:Filebeat 详解
- 下一篇:Rsyslog 集中化日志实战
- 相关阅读:Linux 系统日志管理入门 | journalctl 日志查询指南