欢迎光临
我们一直在努力

Linux命令-syslog(系统日志服务 rsyslog 守护进程)

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)一览

Facility用途
auth / authpriv 认证与安全(login、su、sudo)
cron 计划任务(crond、at)
daemon 守护进程(sshd、nginx、apache)
kern 内核消息(dmesg)
lpr 打印系统
mail 邮件系统(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)
赞(0)
未经允许不得转载:171主机测评 » Linux命令-syslog(系统日志服务 rsyslog 守护进程)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址