应通过 systemd-journal-remote 搭建集中式日志接收端,客户端用 systemd-journal-upload 推送结构化日志,避免 rsyslog 转发导致字段丢失;时间需统一时区,storage 和 forwardtosyslog 配置须准确。

怎么用 journalctl 实时看多台机器的 systemd 日志
直接 ssh 连每台机器跑 journalctl -f 效率低、难比对,真要集中看,得靠日志转发。systemd 自带 journald 支持远程传输,但默认不开启,且必须配 ForwardToSyslog=no 才能避免日志重复或丢失。
实操建议:
- 在每台节点的
/etc/systemd/journald.conf里设ForwardToSyslog=yes(如果已用 rsyslog/rsyslog-ng)或Storage=volatile+SystemMaxUse=512M控制本地日志体积 - 用
systemd-journal-remote搭接收端:监听 HTTPS 或 HTTP(测试可用),路径固定为/receive,客户端用systemd-journal-upload推送 - 别直接用
rsyslog转发journal,它会把结构化字段(如_PID、SYSLOG_IDENTIFIER)转成纯文本,查unit或priority就失效了
grep 和 awk 在日志里定位错误最稳的写法
集群日志量大,grep "error" 会漏掉 ERR、Level=error、甚至中文“错误”,也容易匹配到正常日志里的单词(比如 username 里有 err)。
实操建议:
- 先用
journalctl -o json输出结构化 JSON,再用jq精准筛字段:journalctl -o json | jq 'select(.PRIORITY == 3 or .SYSLOG_LEVEL == "err")' - 非 JSON 场景下,用
awk匹配整字段:awk '$5 ~ /^(ERR|ERROR|err|error)$/ {print}' /var/log/messages,避免跨列误匹配 - 时间范围别靠肉眼数行,用
journalctl --since "2024-05-20 14:00:00" --until "2024-05-20 14:05:00",注意时区——所有节点必须timedatectl set-timezone Asia/Shanghai同步,否则时间过滤失效
用 prometheus + node_exporter 监控日志关键词频次靠谱吗
不靠谱。Prometheus 是指标系统,不是日志系统。node_exporter 根本不解析日志内容,它的 textfile_collector 只能读取静态文件里的 key-value,没法实时统计 “Failed to connect” 出现次数。
实操建议:
- 想告警日志关键词,该用
mtail或promtail:前者轻量嵌入式,适合单机;后者配合 Loki,支持正则提取 + 标签打点 + 基于日志内容的 PromQL 查询 - 如果硬要用 Prometheus,只能走折中路:写个脚本定时
grep -c "timeout" /var/log/syslog,输出到/var/lib/node_exporter/textfile/timeout_count.prom,但延迟高、易丢计数、不支持上下文追溯 - 注意
mtail的正则回溯风险——日志行太长或正则写成.*嵌套,CPU 会飙到 100%,上线前务必用mtail -one_shot -logtostderr -progs your.mtail test.log测压
为什么 rsyslog 配 filter 总是不生效
常见现象是写了 if $msg contains 'OOM' then /var/log/oom.log,但日志还是全进 /var/log/messages,没分流。根本原因是 rsyslog 的 filter 规则顺序敏感,且 $msg 默认不含 program name 和 timestamp,实际匹配的是纯消息体,而很多日志格式里 OOM 提示藏在 msg 后半段甚至被截断。
实操建议:
- 先用
rsyslogd -N1检查配置语法,再用logger "test OOM killed process"测试规则是否触发 - 改用
property匹配更稳:if $syslogtag startswith 'kernel:' and $msg contains 'Killed process' then /var/log/oom.log - 集群环境别只配 client 端,server 端的
imtcp模块必须启用,且$InputTCPServerRun 514后要加$AllowedSender TCP 192.168.1.0/24,否则收不到日志
journald 是否开了 Storage=persistent、rsyslog 的 imfile 是否有权限读日志路径、以及所有时间戳到底对没对上时区。这些细节一错,后面全白搭。










