Linux命令-syslog(系统日志服务 rsyslog 守护进程))
-
- 🔰 简介
- 📖 语法
- ⚙️ 选项
- 💡 配置文件详解
-
- `/etc/rsyslog.conf` 结构(CentOS 7+)
- 设施(Facility)一览
- 优先级(Priority)
- 💡 实战示例
-
- 示例 1:服务启停与状态查询
- 示例 2:使用 logger 工具测试日志
- 示例 3:查看日志文件结构与配置
- 示例 4:自定义规则 – 应用专属日志
- 示例 5:远程日志收集(client → server)
- 示例 6:日志轮转 logrotate 联动
- ⚠️ 注意事项
- 📝 总结
- 📚 相关命令
快速参考 syslog 在 Linux 语境下通常指代 rsyslogd(Reliable and Extended Syslog)——RHEL/CentOS/Ubuntu 等主流发行版默认的 系统日志守护进程。它负责收集来自内核、应用、设备等的日志消息,并按照"设施(facility)"和"优先级(priority)"的规则将日志写入 /var/log/ 下的对应文件。在 systemd-journald 普及后,rsyslog 仍作为"日志的二级持久化层"与 journald 协作,是排查系统问题的核心依赖。
文中路径以 CentOS/RHEL 为准(/etc/rsyslog.conf),Debian/Ubuntu 的配置基本一致,仅包名 rsyslog 安装方式不同。
🔰 简介
| 守护进程名 | rsyslogd(早期叫 syslogd) |
| 所属包 | rsyslog |
| 主配置文件 | /etc/rsyslog.conf |
| 自定义配置目录 | /etc/rsyslog.d/*.conf(按文件名顺序加载) |
| 主配置目录 | /etc/sysconfig/rsyslog(RHEL)/ /etc/default/rsyslog(Debian) |
| 工作目录 | /var/spool/rsyslog/(队列缓冲,磁盘满时使用) |
| 默认日志目录 | /var/log/ |
| 传统日志 socket | /dev/log(Unix domain socket,类型:dgram) |
| 监听协议 | UDP 514(默认)、TCP 514(可选)、RELP/TLS(高级) |
| 与 journald 关系 | journald 收集 → rsyslog 转发并写文件(journald 是上游,rsyslog 是下游) |
| 单元文件 | rsyslog.service |
rsyslog 演进时间线:
| 1980s | syslogd | 原始版本,UDP 无加密 |
| 2004 | syslog-ng | 第三方增强版 |
| 2004+ | rsyslog | 兼容 syslog 协议,增加 RELP/TLS/MySQL/Elasticsearch 输出 |
| 2010s+ | systemd-journald | 二进制日志,结构化索引 |
与同类的对比:
| rsyslog | 文本日志、规则强大、社区主流 | 通用服务器、需文件日志 |
| syslog-ng | 配置更易读、性能优秀 | 企业级、SUSE 默认 |
| journald | 二进制结构化日志、索引快 | systemd 系统的标准组件 |
| fluentd/fluent-bit | 容器云原生日志收集 | K8s/Docker |
📖 语法
rsyslogd [选项]
# 现代 Linux 推荐通过 systemd 管理
systemctl start|stop|reload|restart rsyslog
⚙️ 选项
| -c FILE | 指定配置文件(默认 /etc/rsyslog.conf) |
| -f FILE | 同 -c |
| -n | 前台运行(调试时使用) |
| -d | 调试模式(输出详细解析过程) |
| -i PIDFILE | 指定 PID 文件路径 |
| -u USER | 以指定用户运行(默认 root) |
| -v / –version | 打印版本 |
| -h / –help | 帮助 |
| -N LEVEL | 配置语法检查(rsyslogd -N1 仅配置,-N2 包含插件) |
| -s DOMAINLIST | 域名后缀列表(抑制 FQDN 中的本地域) |
| -l HOSTLIST | 仅记录指定主机的日志 |
💡 配置文件详解
/etc/rsyslog.conf 结构(CentOS 7+)
# ========== 1. 全局指令 (Global Directives) ==========
$ModLoad imuxsock # 加载本地 Unix socket 监听(/dev/log)
$ModLoad imjournal # 接收来自 systemd-journald 的输入
$ModLoad imklog # 加载内核日志(kmsg)
$ModLoad imudp # 加载 UDP 输入(远程日志)
$UDPServerRun 514
$ModLoad imtcp # 加载 TCP 输入
$InputTCPServerRun 514
# 模板:定义日志格式
$template DynFile,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat # 传统 syslog 格式(含时间戳前缀)
# 队列:磁盘缓冲(避免高负载丢日志)
$WorkDirectory /var/spool/rsyslog
$ActionQueueFileName fwdRule1
$ActionQueueMaxDiskSpace 1g
$ActionQueueSaveOnShutdown on
$ActionQueueType LinkedList
# ========== 2. 规则 (Rules) ==========
# 规则语法:facility.priority action
# facility . priority TAB 动作(写入文件/终端/转发)
# 认证相关
authpriv.* /var/log/secure
# 内核消息(高优先级,单独存放)
kern.* /var/log/kern.log
# 邮件系统
mail.* -/var/log/maillog
# 开头 "-" 表示异步写入(不立即 fsync,提升性能)
# cron 计划任务
cron.* /var/log/cron
# 紧急消息广播给所有登录用户
*.emerg :omusrmsg:*
# 除 auth/authpriv/cron/mail/news/security 外的所有
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# 调试信息(仅开发用)
*.debug /var/log/debug
# 错误及以上
*.err /var/log/spooler
# local0-7 用户自定义
local0.* /var/log/local0.log
设施(Facility)一览
| auth / authpriv | 认证与安全(login、su、sudo) |
| cron | 计划任务(crond、at) |
| daemon | 守护进程(sshd、nginx、apache) |
| kern | 内核消息(dmesg) |
| lpr | 打印系统 |
| 邮件系统(postfix、sendmail) | |
| mark | 时间戳标记(已废弃) |
| news | 新闻协议(NNTP,几乎不用) |
| syslog | syslog 自身 |
| user | 用户级应用 |
| uucp | UUCP 协议(几乎不用) |
| local0 ~ local7 | 8 个自定义设施(应用可独占) |
优先级(Priority)
从高到低(数字越大越严重):
| 0 | emerg | 紧急,系统不可用 |
| 1 | alert | 警报,必须立即处理 |
| 2 | crit | 严重 |
| 3 | err | 错误 |
| 4 | warning | 警告 |
| 5 | notice | 注意 |
| 6 | info | 信息 |
| 7 | debug | 调试 |
注意:规则中使用 mail.info 表示 mail 及以上(info 及更严重),如果只匹配 info 级别,需用 mail.=info(等号精确匹配)。
💡 实战示例
示例 1:服务启停与状态查询
# 启动 rsyslog
$ sudo systemctl start rsyslog
# 设置开机自启
$ sudo systemctl enable rsyslog
Synchronizing state of rsyslog.service with init system...
Created symlink /etc/systemd/system/multi-user.target.wants/rsyslog.service → /usr/lib/systemd/system/rsyslog.service.
# 查看状态
$ systemctl status rsyslog
● rsyslog.service – System Logging Service
Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2024-01-15 09:00:00 CST; 1 day ago
Docs: man:rsyslogd(8)
https://www.rsyslog.com/doc/
Main PID: 987 (rsyslogd)
Tasks: 4 (limit: 23512)
Memory: 5.0M
CGroup: /system.slice/rsyslog.service
└─987 /usr/sbin/rsyslogd -n
# 重载配置(不重启服务,rsyslog 8+ 支持 HUP)
$ sudo systemctl reload rsyslog
# 或传统方式
$ sudo kill -HUP $(pidof rsyslogd)
示例 2:使用 logger 工具测试日志
# 语法:logger [-p facility.priority] [-t tag] "消息"
# 1. 发送一条 info 级别的 user 设施消息
$ logger "Hello from local terminal"
$ tail -1 /var/log/messages
Jan 15 14:30:01 web01 alice: Hello from local terminal
# 2. 指定设施与优先级(模拟 auth 警告)
$ logger -p auth.warning -t SSHD "Failed password for invalid user admin from 1.2.3.4"
$ tail -1 /var/log/secure
Jan 15 14:30:15 web01 SSHD: Failed password for invalid user admin from 1.2.3.4
# 3. 模拟紧急消息(会广播给所有登录用户)
$ logger -p user.emerg "DISK FULL IMMEDIATELY"
Broadcast message from alice@web01:
DISK FULL IMMEDIATELY
Message repeated.
# 4. 通过 TCP 发送远程日志
$ logger -n 192.168.1.100 -P 514 "Remote test message"
# 5. 从标准输入持续记录
$ echo "log from pipe" | logger -t PIPELINE
$ grep PIPELINE /var/log/messages
Jan 15 14:35:00 web01 PIPELINE: log from pipe
示例 3:查看日志文件结构与配置
# 查看主要日志文件
$ ls -lh /var/log/
-rw——- 1 root root 1.2M Jan 15 14:00 messages # 综合日志(应用)
-rw——- 1 root root 380K Jan 15 14:00 secure # 认证日志
-rw——- 1 root root 110K Jan 15 14:00 maillog # 邮件日志
-rw——- 1 root root 45K Jan 15 14:00 cron # 计划任务
-rw——- 1 root root 0 Jan 15 09:00 kern.log # 内核日志
-rw——- 1 root root 2.1M Jan 15 14:30 firewalld # 防火墙日志
drwxr-xr-x 2 root root 4.0K Jan 15 09:00 httpd/ # Apache 虚拟目录
-rw——- 1 root root 256K Jan 15 13:00 yum.log # 包管理器日志
-rw——- 1 root root 1.8M Jan 15 14:00 lastlog # 最后登录信息(二进制)
-rw-r–r– 1 root root 45K Jan 15 14:00 wtmp # 登录登出(二进制)
-rw-r–r– 1 root root 12K Jan 15 14:00 dmesg # 启动时内核消息
# 配置语法检查(-N1 仅检查配置,-N2 包含插件)
$ sudo rsyslogd -N1
rsyslogd: version 8.2102.0, config validation run...
rsyslogd: End of config validation run. Bye.
# 查看主配置
$ grep -v '^#' /etc/rsyslog.conf | grep -v '^$'
$ModLoad imuxsock
$ModLoad imjournal
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
...
示例 4:自定义规则 – 应用专属日志
# 场景:让 MySQL 单独记录到 /var/log/mysql/mysql.log
# 1. 创建专用配置(不要直接改主配置)
$ sudo vim /etc/rsyslog.d/10-mysql.conf
# 写入:
# MySQL 错误日志
:programname, isequal, "mysqld" /var/log/mysql/error.log
:programname, isequal, "mysqld" ~
# ~ 表示丢弃(避免重复写 messages)
# 2. 创建日志目录
$ sudo mkdir -p /var/log/mysql
$ sudo chown mysql:mysql /var/log/mysql
# 3. 重载配置
$ sudo systemctl reload rsyslog
# 4. 测试
$ logger -p local0.info -t mysqld "Test MySQL log entry"
$ sudo tail -f /var/log/mysql/error.log
Jan 15 14:40:00 web01 mysqld: Test MySQL log entry
# 更多自定义规则示例(10-nginx.conf):
:programname, isequal, "nginx" /var/log/nginx-app.log
:programname, isequal, "nginx" stop
示例 5:远程日志收集(client → server)
服务端(192.168.1.100)配置:
$ sudo vim /etc/rsyslog.d/20-remote.conf
# 加载 TCP/UDP 输入
$ModLoad imtcp
$InputTCPServerRun 514
$ModLoad imudp
$UDPServerRun 514
# 按客户端主机名分目录
$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
& stop
$ sudo systemctl restart rsyslog
$ sudo mkdir -p /var/log/remote
客户端配置:
$ sudo vim /etc/rsyslog.d/30-forward.conf
# 将所有日志转发到 server
*.* @@192.168.1.100:514
# @@ 表示 TCP,@ 表示 UDP
# 高级:带 RELP 协议(避免丢日志)
#$ModLoad omrelp
#*.* :omrelp:192.168.1.100:20514
$ sudo systemctl restart rsyslog
验证:
# 客户端发一条
$ logger "Test from client 1.2.3.4"
# 服务端查看
$ ls /var/log/remote/client01/
messages sshd.log ...
$ cat /var/log/remote/client01/messages
Jan 15 15:00:00 client01 root: Test from client 1.2.3.4
示例 6:日志轮转 logrotate 联动
# rsyslog 与 logrotate 协作:每天轮转 messages,保留 7 天压缩
$ cat /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
# rsyslog 8+ 用 rsyslogd.pid
endscript
daily
rotate 7
compress
missingok
notifempty
}
# 手动测试
$ sudo logrotate -d /etc/logrotate.conf # 调试模式(不实际执行)
$ sudo logrotate -f /etc/logrotate.d/syslog # 强制执行
⚠️ 注意事项
1. 配置文件修改后必须重载
sudo systemctl reload rsyslog
# 或
sudo kill -HUP $(pidof rsyslogd)
不要 restart,会丢正在缓冲的日志。
2. 规则顺序很重要 rsyslog 按配置文件中的顺序匹配规则,前面的优先。把精确规则(programname 过滤)放前面,模糊规则(*.info)放后面。
3. 日志丢失的可能原因
- 磁盘满 → 检查 df -h /var
- journald 转发失败 → journalctl -u rsyslog
- imjournal 加载失败 → 检查 $ModLoad imjournal 是否被注释
- 防火墙阻挡 → UDP 514 需 firewall-cmd –add-port=514/udp
4. 时间戳与时区 文本日志默认本地时间;如需 UTC 在全局加 $ActionDefaultTemplateRSYSLOG_TraditionalFileFormat1 调整。
5. journald 与 rsyslog 共存 CentOS 7+ 同时运行 journald(内存中)→ rsyslog(落盘)。两套并存意味着一条消息可能被记两次。禁用重复:
# 关闭 journald 的 rsyslog 转发
$ sudo vim /etc/systemd/journald.conf
ForwardToSyslog=no
$ sudo systemctl restart systemd-journald
6. rsyslog 与 SELinux 自定义日志路径需打 SELinux 标签:
sudo semanage fcontext -a -t var_log_t '/var/log/myapp(/.*)?'
sudo restorecon -Rv /var/log/myapp
7. 性能调优 高日志量场景使用 $MainMsgQueueType FixedArray + $MainMsgQueueHighWatermark 10000,并启用异步写入(路径前加 -)。
📝 总结
rsyslog 是 Linux 日志体系的"中转站":接收 journald / 内核 / 应用 → 按 facility.priority 路由 → 落盘或转发。本节要点:
- 配置核心:$ModLoad(加载输入插件) + facility.priority 规则 + action 动作
- 测试工具:logger -p local0.info -t TAG "message" 是排错第一招
- 重要文件:/var/log/messages(综合)、/var/log/secure(认证)、/var/log/cron(计划任务)
- 运维三连:① 改完配置 reload;② 启停服务走 systemctl;③ 配合 journalctl -u rsyslog 排错
- 现代替代:结构化场景考虑 journald + Loki、Fluent Bit + ES 等云原生方案,但 rsyslog 在兼容性、稳定性上仍是首选
📚 相关命令
| logger | 从命令行发送 syslog 消息 |
| journalctl | systemd-journald 日志查询 |
| logrotate | 日志轮转/压缩/清理 |
| dmesg | 查看内核环形缓冲区 |
| lastlog | 用户最后登录信息 |
| last / lastb | 登录历史(成功/失败) |
| tail -f | 实时跟踪日志 |
| cut / awk / grep | 日志字段提取 |
| logwatch | 日志汇总报告 |
| goaccess | 实时 Web 日志分析(nginx/apache) |




