rsyslog.service 是 Linux 系统中极其重要的核心服务,全称为 “Rocket-fast System for Logging”。它是传统 syslog 守护进程的增强版和替代品,主要职责是管理系统的日志:收集、处理、过滤并将日志写入文件或发送到远程服务器。本文详细介绍 rsyslog,包括其功能、配置和使用方法。
核心功能
- 日志收集:从内核、应用程序、系统服务收集日志信息。
- 高性能:正如其名,它在处理大量日志时速度非常快(每秒可处理百万级消息)。
- 模块化设计:支持通过模块扩展功能,例如支持写入 MySQL/PostgreSQL 数据库。
- 网络传输:支持通过 TCP 和 UDP 协议将日志发送到远程日志服务器(集中式日志管理)。
- 过滤能力:可以根据日志的内容、来源或优先级进行精细的过滤。
配置文件详解
rsyslog 的主配置文件通常位于 /etc/rsyslog.conf,同时也包括 /etc/rsyslog.d/ 目录下的 .conf 文件。
配置文件的基本语法格式为:
<设施(Facility)>.<优先级(Priority)> <动作(Action)>
设施 (Facility) - 日志的来源
表示是谁产生的日志:
- auth / authpriv: 认证相关(如 SSH 登录、sudo)。
- cron: 定时任务。
- daemon: 系统守护进程。
- kern: 内核消息。
- mail: 邮件系统。
- user: 普通用户进程。
- local0 - local7: 自定义保留设施(常用于网络设备或自定义应用)。
- *: 代表所有设施。
优先级 (Priority) - 日志的严重程度
按严重程度从低到高排列:
- debug: 调试信息(最详细)。
- info: 一般信息性消息。
- notice: 正常但重要的条件。
- warning / warn: 警告。
- err / error: 错误。
- crit: 严重情况。
- alert: 需要立即采取行动。
- emerg / panic: 系统不可用(最高级别)。
- none: 不记录任何日志。
动作 (Action) - 日志去哪儿
- /var/log/file: 写入本地文件(绝对路径)。
- user: 发送给指定在线用户。
- *: 发送给所有在线用户。
- @IP_Address: 通过 UDP 发送到远程服务器。
- @@IP_Address: 通过 TCP 发送到远程服务器。
配置示例:
# 将所有内核消息记录到 console
kern.* /dev/console
# 将 info 级别及以上的所有邮件日志记录到 /var/log/maillog
mail.info /var/log/maillog
# 将 cron 的所有日志记录到 /var/log/cron
cron.* /var/log/cron
# 将所有 emerg 级别的日志通知所有在线用户
*.emerg :omusrmsg:*
# 将所有日志(除了邮件、认证、cron)记录到 /var/log/messages
*.info;mail.none;authpriv.none;cron.none /var/log/messages
常见日志文件位置
在大多数 Linux 发行版(如 CentOS/RHEL 或 Ubuntu/Debian)中,rsyslog 会将日志写入以下标准位置:
- /var/log/messages (RHEL/CentOS) 或 /var/log/syslog (Ubuntu/Debian):
- /var/log/secure (RHEL) 或 /var/log/auth.log (Ubuntu):
- 安全认证日志(SSH 登录成功/失败、用户添加等)。
- /var/log/dmesg:
- /var/log/cron:
- /var/log/boot.log:
服务管理命令
使用 systemctl 来管理 rsyslog 服务:
- 查看状态(检查是否运行正常):
- 启动服务:
- 停止服务:
- 重启服务(修改配置文件后必须执行):
systemctl restart rsyslog
- 设置开机自启:
高级应用:配置日志服务器
rsyslog 可以配置为服务器模式,接收其他 Linux 主机发来的日志,实现日志集中管理。
步骤简述:
-
编辑 /etc/rsyslog.conf。
-
取消以下模块的注释(启用 UDP 或 TCP):
# 提供 UDP 接收
module(load="imudp")
input(type="imudp" port="514")
# 提供 TCP 接收
module(load="imtcp")
input(type="imtcp" port="514")
-
重启服务。
-
在客户端机器的配置中,添加指向该服务器 IP 的行(例如 *.* @192.168.1.100)。
rsyslog 与 systemd-journald 的关系
在现代 Linux 系统(如 CentOS 7/8/9, Ubuntu 16.04+)中,同时存在 systemd-journald 和 rsyslog。
- systemd-journald:是
systemd 的一部分,它最先捕获日志。它将日志以二进制格式存储在内存或 /run/log/journal 中(重启可能丢失,除非配置持久化)。
- rsyslog:它从
journald 读取数据,并将日志以纯文本格式持久化写入 /var/log/ 目录下的文件中。
总结:journald 负责收集和短期/二进制存储,rsyslog 负责长期存储、文本化处理和远程传输。通常我们查看历史日志还是习惯去 /var/log/ 看 rsyslog 生成的文件。
日志轮转 (Logrotate)
虽然不是 rsyslog 本身的功能,但必须提到。为了防止日志文件无限增长占满磁盘,Linux 使用 logrotate 工具配合 rsyslog。它会定期(如每天)将日志文件重命名(如 messages-20231001)并压缩,只保留最近的几份。
实战
Docker、Kubelet 或 Containerd 日志拆分
防止 Docker、Kubelet 或 Containerd 等组件将海量日志灌入 /var/log/syslog(或 /var/log/messages),最有效且通用的方法是在 rsyslog 层面进行过滤。
因为这些服务通常由 systemd 管理,它们的输出会被发送到 journald,而 rsyslog 会从 journald 读取数据并写入 syslog 文件。
方法一:配置 rsyslog 过滤(最推荐)
这是最直接的方法,可以在日志写入磁盘文件之前直接将其拦截并丢弃,或者重定向到单独的文件。
- 创建过滤配置文件
在 /etc/rsyslog.d/ 目录下创建一个新的配置文件。文件名建议以数字开头(如 10-),以确保它在系统默认规则(通常是 50-default.conf)之前生效。
sudo vim /etc/rsyslog.d/10-k8s-filter.conf
- 添加过滤规则
根据你的需求,选择以下其中一种配置填入文件:
选项 A:直接丢弃(不记录这些日志)
如果你不需要在 syslog 中保留这些日志(因为你可以通过 kubectl logs 或 docker logs 查看容器日志,通过 journalctl 查看服务日志),可以直接丢弃:
# 过滤 Docker 相关日志
if $programname == 'dockerd' then stop
if $programname == 'docker' then stop
if $programname == 'containerd' then stop
# 过滤 Kubernetes/Kubelet 相关日志
if $programname == 'kubelet' then stop
if $programname == 'kube-proxy' then stop
选项 B:重定向到独立文件(防止污染主 syslog)
如果你想保留这些日志,但不想让它们把 /var/log/syslog 弄乱,可以将它们写入单独的文件:
# 将 kubelet 日志写入单独文件,并停止后续处理(即不写入 syslog)
if $programname == 'kubelet' then /var/log/kubelet.log
& stop
# 将 docker 守护进程日志写入单独文件
if $programname == 'dockerd' then /var/log/dockerd.log
& stop
注意:& stop 表示匹配到上一条规则后,停止处理后续规则,这是防止它继续写入 syslog 的关键。
- 重启 rsyslog 服务
配置修改后,必须重启服务才能生效:
sudo systemctl restart rsyslog