rsyslog 8.2112.0 常用 CLI 命令与工具详解

rsyslog 命令行工具链全解:rsyslogd 标志(-v/-N1/-f/-i/-dn)逐条实测、logger 五参数变体与 journal PRIORITY 验证、ss/lsof 监听句柄透视、logrotate 轮转与 HUP 联动实测,回显逐行采集自 Ubuntu 22.04。

rsyslog监控rsyslog2026/10/20

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守护进程本体版本确认、配置校验、独立实例、调试排障
loggersyslog 客户端模拟应用投递消息、验证接收链路、脚本埋点
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 配置、独立 -i pid(绝对路径)、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 命令复核。

十、参考链接