Linux 日志分类与优先级 + Rsyslog 日志转发

一、Linux 日志的核心分类

Linux 日志的分类遵循 syslog 标准,核心分为两大维度:设施(Facility)优先级(Priority)。所有系统日志和应用日志都会被赋予这两个属性,用于 rsyslog 等服务识别、过滤和转发。

1. 设施(Facility):日志的“来源类型”

设施代表日志的产生主体,用于区分不同的系统服务或应用模块。Linux 定义了 16 个标准设施(部分为预留),常见设施如下表:

设施值 设施名称 含义 典型产生程序
0 kern 内核日志 内核、驱动
1 user 用户级日志 普通用户应用程序
2 mail 邮件系统日志 sendmail、postfix
3 daemon 守护进程日志 sshd、httpd、crond
4 auth 认证/授权日志 login、su、sudo
5 syslog syslog 自身日志 rsyslogd
6 lpr 打印系统日志 cups、lpr
7 news 新闻组系统 innd
8 uucp UUCP 系统 uucico
9 cron 定时任务日志 crond、atd
10 authpriv 私密认证日志 sshd(含敏感信息如密码)
11 ftp FTP 服务日志 vsftpd
12-15 local0-local7 本地自定义设施 用于用户自己的应用程序

关键说明

  • local0-local7 是为用户预留的设施,应用程序开发时优先使用这 8 个设施,避免与系统默认设施冲突。
  • 设施的标识可以用名称(如 local1)或数字值(如 17 对应 local1)。

2. 优先级(Priority):日志的“紧急程度”

优先级代表日志的重要性级别,从 0(最高)到 7(最低)共 8 级。rsyslog 可以根据优先级过滤日志(例如只记录 warning 及以上级别的日志)。

优先级值 优先级名称 含义 处理建议
0 emerg(panic) 系统不可用 核心故障,需立即处理(如内核崩溃)
1 alert 必须立即修复 如数据库损坏、磁盘满
2 crit 严重错误 如服务崩溃、权限被篡改
3 err(error) 普通错误 如配置文件错误、函数调用失败
4 warning(warn) 警告 如磁盘空间低、连接超时
5 notice 注意事项 正常但重要的事件(如服务启动)
6 info 普通信息 如用户登录、操作记录
7 debug 调试信息 开发调试用(如变量值、函数流程)

核心规则

  • 优先级是包含关系:例如配置 *.warning 会包含 warningerrcritalertemerg 级别的日志。
  • 优先级名称可简写(如 err 等价于 error),数字值也可直接使用。

3. 日志分类的完整标识:设施.优先级

Linux 日志的分类采用 设施.优先级 的组合格式,这是 rsyslog 配置的核心语法。

  • 示例 1:cron.err → 定时任务产生的错误日志
  • 示例 2:local0.warning → 自定义应用(local0)产生的警告及以上日志
  • 示例 3:*.* → 所有设施、所有优先级的日志

二、Rsyslog 工作原理与日志流转逻辑

rsyslog 是 Linux 主流的日志管理服务,取代了传统的 syslogd,支持本地日志存储、远程日志转发、日志过滤、格式自定义等功能。

1. Rsyslog 核心架构

[应用程序] → [syslog API/lib] → [/dev/log 套接字] → [rsyslog 服务] → [目标存储]
                   ↑                  ↑                   ↑                ↑
          生成带设施/优先级的日志    接收本地日志请求     过滤/处理日志     本地文件/远程服务器

流程拆解

  1. 应用程序发日志:应用通过 syslog() 函数(或第三方日志库),指定日志的设施优先级,将日志内容发送到本地的 /dev/log Unix 套接字。
  2. rsyslog 接收日志rsyslogd 进程监听 /dev/log 套接字,获取所有本地日志请求。
  3. rsyslog 过滤日志:根据 /etc/rsyslog.conf/etc/rsyslog.d/*.conf 配置文件的规则,对日志按 设施.优先级 过滤。
  4. rsyslog 转发日志:将过滤后的日志写入本地文件远程 rsyslog 服务器,或其他目标(如数据库、消息队列)。

2. Rsyslog 核心配置文件

配置文件 作用
/etc/rsyslog.conf 主配置文件,定义全局规则和默认日志存储路径
/etc/rsyslog.d/*.conf 自定义配置文件,推荐将应用日志规则放在这里(避免修改主配置)
/var/lib/rsyslog/ rsyslog 运行时状态文件(如持久化的队列数据)

配置文件语法规则

# 格式:过滤规则  目标动作
<设施.优先级>      <目标>
  • 过滤规则:支持通配符(* 代表所有,! 代表排除),例如 local0.*;!local0.debug → 匹配 local0 设施的所有日志,但排除 debug 级别。
  • 目标动作
    • 本地文件:/var/log/app.log
    • 远程服务器:@192.168.1.100:514(UDP 协议)、@@192.168.1.100:514(TCP 协议)
    • 管道:|/usr/bin/logger
    • 用户终端:root(将日志发送到 root 用户的当前终端)

三、应用程序将日志发送到 Rsyslog

前置准备

  1. 确保 rsyslog 服务已安装并运行:
    # 安装(CentOS/RHEL)
    yum install -y rsyslog
    # 安装(Ubuntu/Debian)
    apt install -y rsyslog
    
    # 启动并设置开机自启
    systemctl start rsyslog
    systemctl enable rsyslog
    systemctl status rsyslog # 检查状态,确保 active (running)
    
  2. 确认 /dev/log 套接字存在:
    ls -l /dev/log
    # 输出:srw-rw-rw- 1 root root 0  日志  /dev/log
    

Shell 脚本通过 logger 命令发日志

logger 是 Linux 内置命令,用于在命令行/脚本中向 rsyslog 发送日志,是测试 rsyslog 配置的最佳工具。

1.1 logger 命令语法
logger [选项] "日志内容"

核心选项:

  • -p <设施.优先级>:指定日志的设施和优先级(必选)
  • -t <标签>:为日志添加标签,方便识别来源
  • -f <文件>:将文件内容作为日志发送
1.2 实操示例:Shell 脚本发日志

步骤 1:编写测试脚本 app_logger.sh

#!/bin/bash
# 定义日志设施和优先级
FACILITY="local1"
PRIORITY="info"

# 发送不同级别的日志
logger -p ${FACILITY}.debug -t "MY_APP" "这是 debug 级别的调试日志"
logger -p ${FACILITY}.info -t "MY_APP" "这是 info 级别的普通日志"
logger -p ${FACILITY}.warning -t "MY_APP" "这是 warning 级别的警告日志"
logger -p ${FACILITY}.err -t "MY_APP" "这是 err 级别的错误日志"

步骤 2:配置 rsyslog 接收 local1 设施的日志
创建自定义配置文件 /etc/rsyslog.d/my_app.conf

# 规则:local1 设施的所有优先级日志 → 写入 /var/log/my_app.log
local1.*    /var/log/my_app.log

# 可选:将 local1.warning 及以上日志转发到远程服务器(192.168.1.100)
# local1.warning   @@192.168.1.100:514

步骤 3:重启 rsyslog 并执行脚本

# 重启 rsyslog 使配置生效
systemctl restart rsyslog

# 执行脚本
chmod +x app_logger.sh
./app_logger.sh

步骤 4:验证日志是否写入

cat /var/log/my_app.log

预期输出(格式:时间 主机名 标签 日志内容):

2025-12-11T10:00:00 localhost MY_APP: 这是 debug 级别的调试日志
2025-12-11T10:00:00 localhost MY_APP: 这是 info 级别的普通日志
2025-12-11T10:00:00 localhost MY_APP: 这是 warning 级别的警告日志
2025-12-11T10:00:00 localhost MY_APP: 这是 err 级别的错误日志

四、进阶:Rsyslog 远程日志转发(局域网场景)

在局域网环境中,通常会搭建中央日志服务器,将所有主机的日志集中存储。以下是快速配置步骤:

1. 配置 Rsyslog 服务器(192.168.1.100)

步骤 1:修改 rsyslog 主配置,启用远程接收
编辑 /etc/rsyslog.conf,取消以下两行注释(启用 TCP/UDP 监听):

# UDP 监听 514 端口(默认)
module(load="imudp")
input(type="imudp" port="514")

# TCP 监听 514 端口(推荐,可靠传输)
module(load="imtcp")
input(type="imtcp" port="514")

步骤 2:配置服务器接收规则
创建 /etc/rsyslog.d/remote.conf

# 接收所有远程日志,按客户端 IP 存储
$template RemoteLog,"/var/log/remote/%FROMHOST-IP%/syslog.log"
*.*    ?RemoteLog

该配置会为每个客户端 IP 创建独立的日志目录(如 /var/log/remote/192.168.1.101/)。

步骤 3:重启 rsyslog 并开放防火墙端口

systemctl restart rsyslog
# 开放 514 端口(CentOS/RHEL)
firewall-cmd --add-port=514/tcp --add-port=514/udp --permanent
firewall-cmd --reload

2. 配置 Rsyslog 客户端(局域网内其他主机)

编辑 /etc/rsyslog.d/remote_client.conf

# 将 local1 设施的所有日志转发到服务器(TCP 协议)
local1.*    @@192.168.1.100:514

# 可选:将系统所有日志转发到服务器
# *.*    @@192.168.1.100:514

重启客户端 rsyslog:

systemctl restart rsyslog

3. 验证远程转发

在客户端运行场景 的日志发送脚本,然后在服务器查看日志:

cat /var/log/remote/客户端IP/syslog.log

五、关键注意事项

  1. 权限问题/var/log 目录默认是 root 权限,rsyslog 运行用户是 root,因此应用程序无需特殊权限即可发日志。
  2. 日志轮转:日志文件会不断增大,需配置 logrotate 定期切割(默认配置在 /etc/logrotate.d/rsyslog)。
  3. 调试 rsyslog:如果日志不生效,可查看 rsyslog 自身日志排查问题:
    tail -f /var/log/messages | grep rsyslog
    
  4. 优先级过滤:生产环境建议关闭 debug 级日志,避免日志量过大,例如配置 local1.!debug

六、总结

  1. Linux 日志的核心分类是 设施(来源)+ 优先级(重要性)local0-local7 是应用程序的专属设施。
  2. 应用程序发日志到 rsyslog 的两种方式:
    • 脚本/命令行:使用 logger 命令,简单快捷。
    • C/C++ 应用:调用 syslog() 函数,原生高效。
  3. Rsyslog 支持本地存储远程转发,局域网环境下可搭建中央日志服务器实现集中管理。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐