人人都会AI编程

24.1 系统日志体系:rsyslog 服务、日志级别、日志分类

更新时间:2026-07-12

系统日志是 Linux 运维中最基础也最可靠的诊断工具。无论服务崩溃、硬件异常还是安全入侵,第一手线索几乎都藏在日志里。Linux 的日志体系基于传统的 Unix syslog 协议,而 rsyslog 则是绝大多数发行版默认搭载的、高性能、模块化的 syslog 服务实现。

1. rsyslog 的角色
rsyslog(rocket-fast syslog)是一个功能强大的日志处理服务,负责从内核、应用以及本机或远程其他系统的日志消息中收集、过滤、分类和存储信息。相比原始的 syslogd,它支持:

  • 多线程与缓冲,处理大量日志时不会轻易丢失消息;
  • 灵活的配置语法,可基于消息内容、来源、级别等进行复杂路由;
  • 将日志同时写入本地文件、数据库、远程服务器等多种目标。

在采用 systemd 的系统中,日志通常先由 systemd-journald 统一收集,再转发给 rsyslog 写入传统的文本文件,所以两者经常协同工作。

2. 日志分类(Facility)
“分类”用于标识日志消息的来源或子系统,帮助管理员将不同组件的日志拆开到不同文件中。常见的 facility 及其含义:

| Facility | 用途 |
|----------|------|
| auth | 认证相关(如 login、su),通常会记入 secure 日志 |
| authpriv | 私密的认证信息(建议使用) |
| cron | 计划任务服务(cron、at) |
| daemon | 各类后台守护进程,无专用分类时使用 |
| kern | 内核消息 |
| lpr | 打印服务 |
| mail | 邮件系统(Postfix、Sendmail 等) |
| news | Usenet 新闻服务 |
| syslog | syslog 服务自身的内部消息 |
| user | 用户进程的通用分类 |
| uucp | UUCP 系统(已几乎废弃) |
| local0local7 | 保留给本地应用自由使用,常用于自定义应用日志分流 |

管理员可以通过 facility 将不同服务的日志写到不同文件,例如邮件的日志全部送到 /var/log/maillog,计划任务日志送到 /var/log/cron

3. 日志级别(Severity/Priority)
每个日志消息都有一个优先级,用以表示事件的紧急程度。级别从高到低共 8 个等级(编号 0~7):

| 级别 | 编号 | 含义 |
|---------|------|------|
| emerg | 0 | 系统不可用(如内核 panic) |
| alert | 1 | 需要立即采取措施 |
| crit | 2 | 严重情况(如硬件错误) |
| err | 3 | 一般性错误 |
| warning| 4 | 警告信息 |
| notice| 5 | 正常但值得注意的事件 |
| info | 6 | 一般性操作信息 |
| debug | 7 | 调试级别消息,非常详细 |

在配置中指定一个级别时,rsyslog 会记录该级别及其以上所有级别的消息。比如 cron.warning 表示将所有 cron 产生的 warning、err、crit、alert、emerg 级别的消息都匹配进来。

4. 配置规则与示例
rsyslog 的主配置文件通常为 /etc/rsyslog.conf,并可引用 /etc/rsyslog.d/ 下的 .conf 文件。核心规则格式为:

facility.priority   action

其中 action 通常是日志文件的绝对路径(前缀 - 可关闭每条消息后的同步写入,提高性能),也可以是管道、远程地址或数据库等。

常见配置示例:

# 将所有内核消息写入 /var/log/kern.log
kern.*                        /var/log/kern.log

# 将邮件系统 info 及以上级别的日志写入 maillog
mail.info                     /var/log/maillog

# cron 的所有消息写入 cron.log
cron.*                        /var/log/cron.log

# 认证相关的所有消息写入 secure
authpriv.*                    /var/log/secure

# 除了 mail、authpriv、cron 之外的所有 info 及以上消息写入 messages
*.info;mail.none;authpriv.none;cron.none    /var/log/messages

最后一条规则利用分号组合多个条件,并用 none 排除特定分类,避免 messages 文件过于杂乱。配置修改后需重启服务使其生效:

sudo systemctl restart rsyslog

5. 常用日志文件位置(传统 syslog 日志)

  • /var/log/messages:通用系统消息(多数守护进程、内核等)
  • /var/log/secure:认证、授权相关(如 ssh 登录、sudo 操作)
  • /var/log/cron:计划任务运行记录
  • /var/log/maillog:邮件服务日志
  • /var/log/boot.log:系统启动时的服务输出
  • /var/log/kern.log:内核消息(部分发行版独立记录)

实时跟踪某个日志文件的变化,可以用 tail -f

tail -f /var/log/syslog      # Debian/Ubuntu 的综合性主日志
tail -f /var/log/messages    # RHEL/CentOS 的综合性主日志

6. 测试日志消息
你可以用 logger 命令手动向 syslog 发送消息,用于测试配置是否生效:

logger -p local0.info "测试消息:服务启动成功"

这条命令会以 facility local0、级别 info 发送字符串,然后可以去对应的日志文件或 journal 中验证是否被正确路由。

小结
rsyslog 构建了一个灵活且可靠的日志收集框架。理解 facility 和 priority 的组合,你就可以让不同来源、不同严重程度的日志精确地分流到不同文件,既方便日常查看,也为后续集中式日志分析(如 ELK/EFK 栈)打下基础。掌握日志体系,是运维排查能力的核心基本功。