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 能采任意文件——从系统日志引擎变身通用采集器。
- 观测云接入:Rsyslog 可直接把日志转发到 DataKit 的 syslog 输入,无缝入云。
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 接入
- 转发到 DataKit:DataKit 开启 syslog 输入(TCP/UDP 监听),Rsyslog 配置
*.* @@datakit-host:514(或按 facility 过滤后转发),系统日志即刻入云; - 替代方案:主机直接装 DataKit 采集
/var/log文件——功能等价且多了 Pipeline 解析能力,新环境推荐后者; - 解析:Pipeline 解析 syslog 头部(时间/host/facility/severity),severity 映射标准
status; - 告警:监控器对 authpriv 失败登录暴破、内核 OOM 等模式告警,通知钉钉/企业微信/飞书。
常见问题(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 日志查询指南