Linux日志分类, 优先级别及日志发到rsyslog目标流程总结
Linux日志通过设施(Facility)和优先级(Priority)分类,设施标识日志来源(如kern、mail、local0-7),优先级表示紧急程度(0-7级)。Rsyslog作为日志管理服务,接收应用日志后根据/etc/rsyslog.conf配置进行过滤和转发,支持本地存储或发送到远程服务器。通过logger命令或syslog API可发送日志,使用local0-7设施可避免与系统日志冲
Linux 日志分类与优先级 + Rsyslog 日志转发
一、Linux 日志的核心分类
Linux 日志的分类遵循 syslog 标准,核心分为两大维度:设施(Facility) 和 优先级(Priority)。所有系统日志和应用日志都会被赋予这两个属性,用于 rsyslog 等服务识别、过滤和转发。
1. 设施(Facility):日志的“来源类型”
设施代表日志的产生主体,用于区分不同的系统服务或应用模块。Linux 定义了 16 个标准设施(部分为预留),常见设施如下表:
| 设施值 | 设施名称 | 含义 | 典型产生程序 |
|---|---|---|---|
| 0 | kern | 内核日志 | 内核、驱动 |
| 1 | user | 用户级日志 | 普通用户应用程序 |
| 2 | 邮件系统日志 | 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会包含warning、err、crit、alert、emerg级别的日志。 - 优先级名称可简写(如
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 服务] → [目标存储]
↑ ↑ ↑ ↑
生成带设施/优先级的日志 接收本地日志请求 过滤/处理日志 本地文件/远程服务器
流程拆解:
- 应用程序发日志:应用通过
syslog()函数(或第三方日志库),指定日志的设施和优先级,将日志内容发送到本地的/dev/logUnix 套接字。 - rsyslog 接收日志:
rsyslogd进程监听/dev/log套接字,获取所有本地日志请求。 - rsyslog 过滤日志:根据
/etc/rsyslog.conf和/etc/rsyslog.d/*.conf配置文件的规则,对日志按设施.优先级过滤。 - 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
前置准备
- 确保 rsyslog 服务已安装并运行:
# 安装(CentOS/RHEL) yum install -y rsyslog # 安装(Ubuntu/Debian) apt install -y rsyslog # 启动并设置开机自启 systemctl start rsyslog systemctl enable rsyslog systemctl status rsyslog # 检查状态,确保 active (running) - 确认
/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
五、关键注意事项
- 权限问题:
/var/log目录默认是root权限,rsyslog 运行用户是root,因此应用程序无需特殊权限即可发日志。 - 日志轮转:日志文件会不断增大,需配置
logrotate定期切割(默认配置在/etc/logrotate.d/rsyslog)。 - 调试 rsyslog:如果日志不生效,可查看 rsyslog 自身日志排查问题:
tail -f /var/log/messages | grep rsyslog - 优先级过滤:生产环境建议关闭
debug级日志,避免日志量过大,例如配置local1.!debug。
六、总结
- Linux 日志的核心分类是 设施(来源)+ 优先级(重要性),
local0-local7是应用程序的专属设施。 - 应用程序发日志到 rsyslog 的两种方式:
- 脚本/命令行:使用
logger命令,简单快捷。 - C/C++ 应用:调用
syslog()函数,原生高效。
- 脚本/命令行:使用
- Rsyslog 支持本地存储和远程转发,局域网环境下可搭建中央日志服务器实现集中管理。
更多推荐


所有评论(0)