rsyslog.service Linux 日志服务介绍

发布时间: 更新时间: 总字数:2130 阅读时间:5m 作者: IP上海 分享 网址

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) - 日志的严重程度

按严重程度从低到高排列:

  1. debug: 调试信息(最详细)。
  2. info: 一般信息性消息。
  3. notice: 正常但重要的条件。
  4. warning / warn: 警告。
  5. err / error: 错误。
  6. crit: 严重情况。
  7. alert: 需要立即采取行动。
  8. emerg / panic: 系统不可用(最高级别)。
  9. 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 status rsyslog
    
  • 启动服务
    systemctl start rsyslog
    
  • 停止服务
    systemctl stop rsyslog
    
  • 重启服务(修改配置文件后必须执行):
    systemctl restart rsyslog
    
  • 设置开机自启
    systemctl enable rsyslog
    

高级应用:配置日志服务器

rsyslog 可以配置为服务器模式,接收其他 Linux 主机发来的日志,实现日志集中管理。

步骤简述

  1. 编辑 /etc/rsyslog.conf

  2. 取消以下模块的注释(启用 UDP 或 TCP):

    # 提供 UDP 接收
    module(load="imudp")
    input(type="imudp" port="514")
    
    # 提供 TCP 接收
    module(load="imtcp")
    input(type="imtcp" port="514")
    
  3. 重启服务。

  4. 在客户端机器的配置中,添加指向该服务器 IP 的行(例如 *.* @192.168.1.100)。

rsyslog 与 systemd-journald 的关系

在现代 Linux 系统(如 CentOS 7/8/9, Ubuntu 16.04+)中,同时存在 systemd-journaldrsyslog

  • 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 过滤(最推荐)

这是最直接的方法,可以在日志写入磁盘文件之前直接将其拦截并丢弃,或者重定向到单独的文件。

  1. 创建过滤配置文件

/etc/rsyslog.d/ 目录下创建一个新的配置文件。文件名建议以数字开头(如 10-),以确保它在系统默认规则(通常是 50-default.conf)之前生效。

sudo vim /etc/rsyslog.d/10-k8s-filter.conf
  1. 添加过滤规则

根据你的需求,选择以下其中一种配置填入文件:

选项 A:直接丢弃(不记录这些日志) 如果你不需要在 syslog 中保留这些日志(因为你可以通过 kubectl logsdocker 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 的关键。

  1. 重启 rsyslog 服务

配置修改后,必须重启服务才能生效:

sudo systemctl restart rsyslog
本文总阅读量 次 本站总访问量 次 本站总访客数
Home Archives Categories Tags Statistics