rsyslog 8.2112.0 常用 CLI 命令与工具详解
rsyslog 命令行工具链全解:rsyslogd 标志(-v/-N1/-f/-i/-dn)逐条实测、logger 五参数变体与 journal PRIORITY 验证、ss/lsof 监听句柄透视、logrotate 轮转与 HUP 联动实测,回显逐行采集自 Ubuntu 22.04。
rsyslog 8.2112.0 常用 CLI 命令与工具详解
目标:把 rsyslog 日常运维要用的命令行工具一次讲透——rsyslogd 守护进程的全部常用标志(-v/-N1/-f/-i/-dn)、logger 投递命令的全参数变体、ss/lsof 监听与句柄验证、journalctl 落盘验证、logrotate 轮转联动。每条命令均在 Ubuntu 22.04.4 实机执行,回显逐行照抄。
一、环境信息
- 操作系统:Ubuntu 22.04.4 LTS(x86_64),主机名
ops - rsyslog 版本:8.2112.0(jammy 仓库版,系统实例由 systemd 托管)
- 实测时间:2026-10-20
- 工具版本:rsyslogd/logger 为 rsyslog 8.2112.0 自带;logrotate 3.19.0;ss/lsof 为 iproute2/lsof 包自带
- 实验工作区:
/opt/data/quzuo/tmp/rsyslog/(独立第二实例的配置、pid、日志全部落这里,不碰系统主配置——方法论见配置参数详解篇开篇) - 依赖认知:rsyslog 的配置对象模型(module/input/template/ruleset/action)见《rsyslog 8.2112.0 配置参数详解》;安装与 systemd 单元见《Ubuntu 22.04 安装 rsyslog 8.2112.0 指南》
二、工具概览
rsyslog 的命令行工具链分四类,各自解决一件事:
| 工具 | 角色 | 常用场景 |
|---|---|---|
| rsyslogd | 守护进程本体 | 版本确认、配置校验、独立实例、调试排障 |
| logger | syslog 客户端 | 模拟应用投递消息、验证接收链路、脚本埋点 |
| ss / lsof | 监听与句柄观测 | 确认端口监听、确认进程打开了哪些 socket/文件 |
| journalctl + grep | 落盘验证 | 验证消息进了 journal 与传统文件 |
| logrotate | 轮转器 | 与 rsyslog 联动压缩归档旧日志 |
一条运维主线贯穿:改配置 → rsyslogd -N1 校验 → 重载/重启 → logger 投测试消息 → journalctl/grep 验证落盘。本文按这条主线展开每个工具。
三、前置条件
- 系统已安装并运行 rsyslog(
systemctl is-active rsyslog为 active); - root 权限(拉第二实例、lsof 看系统进程句柄都需要);
- 独立实验目录已建:
mkdir -p /opt/data/quzuo/tmp/rsyslog/spool-d1; - 本文实验用的迷你实例配置
d1.conf(自定义 socket + UDP 10516 高位端口 + 单文件落盘):
# /opt/data/quzuo/tmp/rsyslog/d1.conf
global(workDirectory="/opt/data/quzuo/tmp/rsyslog/spool-d1")
module(load="imuxsock" SysSock.Use="off")
input(type="imuxsock" Socket="/opt/data/quzuo/tmp/rsyslog/d1.sock")
module(load="imudp")
input(type="imudp" port="10516")
action(type="omfile" file="/opt/data/quzuo/tmp/rsyslog/d1.log")
先校验再启动(实测回显):
rsyslogd -N1 -f /opt/data/quzuo/tmp/rsyslog/d1.conf
rsyslogd -f /opt/data/quzuo/tmp/rsyslog/d1.conf -i /opt/data/quzuo/tmp/rsyslog/d1.pid
rsyslogd: version 8.2112.0, config validation run (level 1), master config d1.conf
rsyslogd: End of config validation run. Bye.
💡 说明:
-N1校验通过后启动无任何输出(守护化成功即静默)。确认它活着用ps -ef | grep 'rsyslogd -f'与后文的 ss/lsof。
四、rsyslogd 命令详解
4.1 帮助与用法文本
rsyslogd 没有长选项帮助,传未知选项会打印用法短文(实测):
rsyslogd -?
echo $?
rsyslogd: invalid option -- '?'
usage: rsyslogd [options]
use "man rsyslogd" for details. To run rsyslog interactively, use "rsyslogd -n"
to run it in debug mode use "rsyslogd -dn"
For further information see https://www.rsyslog.com/doc/
1
用法短文只给了三个入口提示,完整标志清单在 man rsyslogd(本文 4.2-4.5 逐个实测常用标志)。
4.2 -v:版本与编译特性横幅
排查「为什么某个模块参数报 not known」时先看编译特性(实测全量输出):
rsyslogd -v
rsyslogd 8.2112.0 (aka 2021.12) compiled with:
PLATFORM: x86_64-pc-linux-gnu
PLATFORM (lsb_release -d):
FEATURE_REGEXP: Yes
GSSAPI Kerberos 5 support: Yes
FEATURE_DEBUG (debug build, slow code): No
32bit Atomic operations supported: Yes
64bit Atomic operations supported: Yes
memory allocator: system default
Runtime Instrumentation (slow code): No
uuid support: Yes
systemd support: Yes
Config file: /etc/rsyslog.conf
PID file: /run/rsyslogd.pid
Number of Bits in RainerScript integers: 64
See https://www.rsyslog.com for more information.
逐项解读关键行:
8.2112.0 (aka 2021.12):版本号(年.月 命名法),aka是可读化注释;FEATURE_REGEXP: Yes:正则过滤可用(re/erewrite操作符依赖它);FEATURE_DEBUG: No:发行版编译的是 release 版,-d只是运行时调试跟踪,不是 debug 构建;Config file / PID file:编译期默认路径——第二实例用-f/-i覆盖的正是这两个值;systemd support: Yes:notify 型 systemd 集成可用。
4.3 -N1:配置语法校验(发版前必过)
rsyslogd -N1 -f <配置> 只做语法与对象引用校验,不启动进程、不绑端口,是配置变更的唯一放行闸门。对本机主配置校验(实测):
rsyslogd -N1
rsyslogd: version 8.2112.0, config validation run (level 1), master config /etc/rsyslog.conf
rsyslogd: End of config validation run. Bye.
不带 -f 默认校验 /etc/rsyslog.conf(含 drop-in 目录)。报错形态的三类实录(拼写错连环报、参数取值非法、引用不存在的模板导致 action disabled)与判读经验见《rsyslog 8.2112.0 配置参数详解》3.3 节。
4.4 -f / -i:独立实例的启动与停止
-f 指定配置文件、-i 指定 pid 文件,两者合用就是多实例(系统主实例由 systemd 管理,不受影响)。启动实测(回显为空即成功):
rsyslogd -f /opt/data/quzuo/tmp/rsyslog/d1.conf -i /opt/data/quzuo/tmp/rsyslog/d1.pid
ps -ef | grep 'rsyslogd -f' | grep -v grep
root 1290197 1 0 13:33 ? 00:00:00 rsyslogd -f /opt/data/quzuo/tmp/rsyslog/d1.conf -i /opt/data/quzuo/tmp/rsyslog/d1.pid
停止:向 pid 文件记录的进程发 TERM:
kill $(cat /opt/data/quzuo/tmp/rsyslog/d1.pid)
rm -f /opt/data/quzuo/tmp/rsyslog/d1.pid
⚠️ 注意:清进程时不要用
pkill -f 'rsyslogd -f test'这类宽匹配——模式字符串会同时命中你自己的 shell 命令行,把自己杀掉(本实验实测踩过,表现为命令整体 exit -1)。按 pid 文件 kill 最稳。
4.5 -dn:调试模式(排障核武器)
-d 开运行时调试,-n 前台运行(不守护化),调试输出走 stderr。3 秒采样实测:
timeout 3 rsyslogd -dn -f d1.conf -i /opt/data/quzuo/tmp/rsyslog/d1-debug.pid 2>d1-debug.log
wc -l d1-debug.log
head -18 d1-debug.log
实测输出(wc 行数 + 首 18 行节选):
436
4367.797574503:main thread : rsyslogd.c: rsyslogd 8.2112.0 startup, module path '', cwd:/opt/data/quzuo/tmp/rsyslog
4367.797635323:main thread : glbl.c: rsyslog/glbl: using '127.0.0.1' as localhost IP
4367.797651808:main thread : obj.c: caller requested object 'net', not found (iRet -3003)
4367.797655794:main thread : modules.c: Requested to load module 'lmnet'
4367.797657443:main thread : modules.c: loading module '/usr/lib/x86_64-linux-gnu/rsyslog/lmnet.so'
4367.797724303:main thread : modules.c: module lmnet of type 2 being loaded (keepType=0).
4367.797858600:main thread : glbl.c: GenerateLocalHostName uses 'ops'
4367.797864155:main thread : rsyslogd.c: environment variable TZ is not set, auto correcting this to TZ=/etc/localtime
4367.797865524:main thread : rsyslogd.c: deque option n, optarg ''
4367.797866776:main thread : rsyslogd.c: deque option f, optarg 'd1.conf'
4367.797867892:main thread : rsyslogd.c: deque option i, optarg '/opt/data/quzuo/tmp/rsyslog/d1-debug.pid'
4367.797871013:main thread : omfile.c: omfile: using transactional output interface.
判读要点:每行前缀是「相对秒数.纳秒 + 线程名 + 源文件」,deque option 行逐条回放命令行解析;436 行/3 秒的输出量说明只在单实例排障时短开,别在系统主实例上常开。另一个实测教训:调试模式跑在系统环境时必须带 -i 指自己的 pid 文件——不带时它去写编译默认的 /run/rsyslogd.pid,在本实验环境里报 error writing pid file (creation stage): Permission denied、退出码 -3000。
4.6 信号控制(man 手册要点 + 实测依据)
rsyslogd 响应的信号(来源:man rsyslogd SIGNALS 节,Ubuntu 8.2112.0):
| 信号 | 效果 | 典型场景 |
|---|---|---|
| HUP | 关闭并重开所有输出文件(不重读配置) | logrotate postrotate 标配(第七章实测) |
| TERM / INT / QUIT | 期待关闭:停输入、冲刷队列、写状态文件 | 优雅停止(systemd stop 即发 TERM) |
| USR1 | 调试辅助(debug 模式下切换调试开关) | 仅调试构建场景 |
HUP 与 restart 的分工:改了配置必须 restart(HUP 不重读配置);logrotate 改了文件名只需 HUP。systemd 时代的发法是 systemctl kill -s HUP rsyslog.service(第七章实测)。
五、logger 命令详解
logger 是 util-linux 提供的 syslog 客户端,五个常用参数把「往哪投、投什么、什么级别」全覆盖。以下每条都实测并验证落点。
5.1 基础投递与标签(-t)
logger -t install-check "rsyslog b1 verify $(date +%H%M%S)"
journalctl -t install-check -n 2 --no-pager
grep install-check /var/log/syslog | tail -1
实测回显:
10月 20 13:09:15 ops install-check[1267476]: rsyslog b1 verify 130915
Oct 20 13:09:15 ops install-check: rsyslog b1 verify 130915
-t 设置 TAG(journal 视角带 pid 后缀 [1267476],传统文件视角不带);两条输出同时出现 = imuxsock 入口与 omfile 落盘双验证通过。
5.2 优先级(-p)
logger -t d1tag -p local0.warn "prio test local0.warn"
journalctl -t d1tag -n 1 --no-pager -o verbose | grep -E 'PRIORITY|SYSLOG_FACILITY|MESSAGE'
grep d1tag /var/log/syslog | tail -1
实测回显:
PRIORITY=4
SYSLOG_FACILITY=16
MESSAGE=prio test local0.warn
Oct 20 13:31:59 ops d1tag: prio test local0.warn
-p 取 facility.priority 形态:local0(=16) + warn(=4)。journal 把 facility 存为 SYSLOG_FACILITY=16、severity 存为 PRIORITY=4(0=emerg 到 7=debug);传统文件默认只在非 info 级别渲染优先级,所以 grep 行看不到 warn 字样——判断级别去 journal 查。
💡 技术拓展:syslog 优先级是「facility × 8 + severity」的一个数字——facility 常用 0-23(kern/user/daemon/auth/local0-7…),severity 固定 0-7(emerg/alert/crit/err/warning/notice/info/debug)。
-p local0.warn即 PRI=132,journal 拆存为 FACILITY=16/PRIORITY=4。过滤时 journalctl 用-p warning按 severity,rsyslog 规则里用local0.warn两者都要写。
5.3 文件内容投递(-f)
printf '%s\n' 'line-one from file' 'line-two from file' > /opt/data/quzuo/tmp/rsyslog/srcfile.log
logger -f /opt/data/quzuo/tmp/rsyslog/srcfile.log
grep "from file" /var/log/syslog | tail -2
实测回显:
Oct 20 13:31:40 ops root: line-one from file
Oct 20 13:31:40 ops root: line-two from file
-f 逐行读文件投递,TAG 缺省为调用用户名(root)。适合把现成文件注入日志链路(如把某次命令输出留档)。
5.4 定向 socket(-u)与网络投递(-n/-P/-d)
第二实例开着自定义 socket 与 UDP 10516,正好演示定向投递:
logger -u /opt/data/quzuo/tmp/rsyslog/d1.sock -t d1viaSocket "via custom socket"
logger -n 127.0.0.1 -P 10516 -d "via udp network 10516"
sleep 2
cat /opt/data/quzuo/tmp/rsyslog/d1.log
实测回显:
2026-10-20T13:31:40.252698+08:00 ops d1viaSocket: via custom socket
2026-10-20T13:31:40.254191+08:00 ops root via udp network 10516
参数分工:-u 走指定 Unix socket(DGRAM);-n 指主机、-P 指端口(默认 514)、-d 强制 UDP(不带 -d 时 logger 对远端默认 TCP)。这三条是验证「中心日志服务器接收链路」的标枪——B1 安装篇第九章的 514 接收验证用的正是 logger -n 127.0.0.1 -P 514 -d。
六、监听与句柄验证(ss / lsof)
6.1 ss:端口监听确认
验证迷你实例的 UDP 10516 监听(实测):
ss -lnup | grep -w 10516
UNCONN 0 0 0.0.0.0:10516 0.0.0.0:* users:(("rsyslogd",pid=1290197,fd=4))
UNCONN 0 0 [::]:10516 [::]:* users:(("rsyslogd",pid=1290197,fd=6))
要点:users:(("rsyslogd",pid=...)) 直接把监听归属到进程,排障时一眼确认「端口确实是 rsyslog 占的」;TCP 用 ss -lntp,UDP 用 ss -lnup(UDP 无 LISTEN 状态,显示 UNCONN)。反向用法验证「不该监听的没监听」:默认 rsyslog 不开 514,ss -lun | grep -w 514 无输出(返回码 1)即正常(完整启用实测见安装篇第九章)。
6.2 lsof:进程句柄透视
系统实例(syslog 用户运行)打开的日志通道(实测节选):
lsof -p $(pidof rsyslogd) | grep -E 'unix|/dev/log|/run/systemd'
rsyslogd 1273530 syslog 3u unix 0xffff8a8cd56f5000 0t0 19958 /run/systemd/journal/syslog type=DGRAM
rsyslogd 1273530 syslog 5u unix 0xffff8a8ce4b37800 0t0 41849203 /var/lib/haproxy/dev/log type=DGRAM
第一行就是 systemd 单元 Requires=syslog.socket 的产物:systemd 把 journal 的 syslog socket 移交给 rsyslog(启动日志里的 Acquired UNIX socket ... from systemd 与之呼应)。第二行 haproxy 的 drop-in(49-haproxy.conf)让它多听了一个应用私有 socket——lsof 是发现「这台机器的 rsyslog 到底在收谁的日志」的最快手段。
迷你实例的句柄画像(实测节选):
lsof -p $(cat /opt/data/quzuo/tmp/rsyslog/d1.pid) | grep -E 'd1|UDP|unix'
rsyslogd 1290197 root 2w REG 8,3 92 9307508 /opt/data/quzuo/tmp/rsyslog/d1.log
rsyslogd 1290197 root 3u unix 0xffff8a8cd3f2d000 0t0 42026795 /opt/data/quzuo/tmp/rsyslog/d1.sock type=DGRAM
rsyslogd 1290197 root 4u IPv4 42026798 0t0 UDP *:10516
2w REG d1.log 是写日志文件的句柄——logrotate 的 rename 会让这个 fd 指向旧 inode,这正是第七章 postrotate 必须发 HUP 的原因。
6.3 journalctl + grep:落盘终验
journal 视角与文件视角的差异对比(5.1/5.2 实测已展示):journal 结构化(PRIORITY/SYSLOG_FACILITY 字段可查)、传统文件纯文本(grep 快)。日常二选一即可:系统上 journalctl 可用时优先 journalctl -t <tag>,处理历史归档(已轮转的 .gz)用 zgrep。
七、logrotate 与 rsyslog 联动
7.1 包自带的轮转规则
rsyslog 包自带 /etc/logrotate.d/rsyslog(实测全文):
/var/log/syslog
/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug
/var/log/messages
{
rotate 4
weekly
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
逐项解读:rotate 4 保留 4 份历史;weekly 每周轮转;missingok/notifempty 缺文件不报错、空文件不轮转;compress + delaycompress 压缩但最近一份延后一期(防读冲突);sharedscripts 多文件共享一次 postrotate;postrotate 调 rsyslog 包带的联动脚本——其实测内容:
#!/bin/sh
if [ -d /run/systemd/system ]; then
systemctl kill -s HUP rsyslog.service
fi
即:有 systemd 就向 rsyslog.service 发 HUP,让 rsyslogd 重开被 rename 的文件——这就是「轮转后日志继续写新文件」的机制闭环。
7.2 联动实测:轮转 → HUP → 新文件续写
在实验工作区复刻完整联动(不碰系统 /var/log)。轮转规则 rot.conf:
/opt/data/quzuo/tmp/rsyslog/d1.log {
weekly
rotate 3
missingok
notifempty
compress
sharedscripts
postrotate
kill -HUP $(cat /opt/data/quzuo/tmp/rsyslog/d1.pid)
endscript
}
实验实例先写一条消息,然后强制轮转,再写一条验证续写(实测):
logger -u d1.sock -t pre-rotate "message before rotation"
logrotate --force --state /opt/data/quzuo/tmp/rsyslog/rot.state /opt/data/quzuo/tmp/rsyslog/rot.conf
ls -la d1.log*
-rw-r--r-- 1 root root 147 10月 20 13:33 d1.log.1.gz
旧内容已压缩进 d1.log.1.gz,新 d1.log 尚为空文件。解包核对旧文件内容并投递新消息:
zcat d1.log.1.gz
logger -u d1.sock -t post-rotate "message after rotation, proves HUP reopen"
cat d1.log
实测回显:
2026-10-20T13:31:40.252698+08:00 ops d1viaSocket: via custom socket
2026-10-20T13:31:40.254191+08:00 ops root via udp network 10516
2026-10-20T13:33:31.327054+08:00 ops pre-rotate: message before rotation
2026-10-20T13:33:33.340671+08:00 ops post-rotate: message after rotation, proves HUP reopen
时间线完整闭合:13:33:31 的消息进了压缩归档,13:33:33(HUP 之后)的消息进了全新 d1.log——轮转零中断、零丢失。
八、注意事项
- 改配置与轮转的信号分工:改配置 restart,轮转文件 HUP,别反了(HUP 不重读配置,restart 会打断瞬时连接);
- 第二实例三隔离:独立
-f配置、独立-ipid(绝对路径)、socket/端口错开(SysSock.Use="off"),少一样都会撞到系统实例; - logger 的默认落点:不带
-n/-u时走/dev/log(journal 体系),消息去向由系统主实例的规则决定——mail.*进 mail.log 不进 syslog,找不到消息先查规则再怀疑链路; - 验证顺序:任何变更后先
rsyslogd -N1,再变更,再logger投标枪消息,最后 journalctl/grep 双视角验证——顺序反了会把「配置错」误判成「链路断」。
九、常见问题(FAQ)
Q1:rsyslogd -dn 报 error writing pid file (creation stage): Permission denied 然后退出 -3000?
调试模式没带 -i,去写编译默认 pid 文件(/run/rsyslogd.pid)失败。第二实例一律 -i /自己的路径/xx.pid(见 4.5 实测)。
Q2:kill $(cat d1.pid) 报「No such file or directory」?
pid 文件没生成(实例没起来)或路径写成了相对路径。启动后先 ps -ef | grep 'rsyslogd -f' 核对,pid 文件用绝对路径最稳(4.4 实测)。
Q3:logger 发的消息 grep 不到了?
三层排查:journalctl -t <tag>(journal 里有没有)→ grep <tag> /var/log/syslog(文件里有没有)→ 都没有则查投递目标(-u/-n 是否指错)与规则(facility 是否被 50-default.conf 排除)。重复消息还会被主配置的 $RepeatedMsgReduction on 折叠。
Q4:logrotate 轮转后 rsyslog 还往旧文件写?
postrotate 没生效——检查规则里 sharedscripts + postrotate ... endscript 是否完整、/usr/lib/rsyslog/rsyslog-rotate 是否存在、手动执行 systemctl kill -s HUP rsyslog.service 是否报错。本章 7.2 的实测流程可直接当验收脚本。
Q5:ss -lnup 看不到 514 但服务正常?
Ubuntu 默认不启用网络接收(imudp/imtcp 注释状态),514 未监听是预期行为;要启用按安装篇第九章加 drop-in,启用后用本章 6.1 的 ss 命令复核。
十、参考链接
- rsyslogd man 手册(本地):
man rsyslogd(8)、man rsyslog.conf(5)、man logger(1) - logger 源码文档(util-linux):https://github.com/util-linux/util-linux
- logrotate 官方文档:https://github.com/logrotate/logrotate
- 官方排障指南:https://www.rsyslog.com/doc/troubleshooting.html
- 本专栏相关篇目:《rsyslog 8.2608.0 介绍与选型指南》《Ubuntu 22.04 安装 rsyslog 8.2112.0 指南》《rsyslog 8.2112.0 配置参数详解》