下面把图里的两条路径(有 rsyslog / 无 rsyslog)做一次系统化说明,并给出关键配置、优缺点、常见故障点与快速自检命令。

有 rsyslog 的路径(传统兼容、易于转发)
数据流:
-
内核 kmsg / 应用日志
- 内核:
/dev/kmsg
- 应用:
printf/stdout/stderr
(由 systemd 接管)、或syslog()
API →/dev/log
- 内核:
-
systemd-journald 收集一切来源,形成二进制 journal。
-
转交给 rsyslog
- 方式 A:
journald
通过 UNIX socket/run/systemd/journal/syslog
转发 - 方式 B:
rsyslog
通过 imjournal 模块直接读 journald(更完整的元数据)
- 方式 A:
-
rsyslog 做过滤、模板、落盘或远程转发:
- 本地文本:
/var/log/messages
、/var/log/secure
等 - 远程:
@host:514
(UDP) /@@host:514
(TCP/TLS)
- 本地文本:
关键配置:
-
/etc/systemd/journald.conf
ini[Journal] ForwardToSyslog=yes # 让 journald 转发给 rsyslog(走方式A时需要) Storage=persistent # 建议;持久化到 /var/log/journal
-
/etc/rsyslog.conf
或/etc/rsyslog.d/*.conf
inimodule(load="imuxsock") # 监听 journald 的 syslog 转发 (/run/systemd/journal/syslog) # 或/并 module(load="imjournal" StateFile="imjournal.state") # 直接读 journald(方式B) *.info;mail.none;authpriv.none;cron.none /var/log/messages # 远程转发示例(UDP / TCP+TLS) *.* @10.0.0.1:514 *.* @@log.example.com:6514
优点:
- 兼容大量只认文本/rsyslog 的工具;易做远程集中(SIEM、ELK、Splunk)。
- 强大的过滤/模板能力。
注意/缺点:
- 文本落盘会丢失 journald 丰富的元数据(UNIT、PID、_SYSTEMD_CGROUP 等)。
- 配置不当会重复采集(同时开
imuxsock
和imjournal
但又让 journald 转发)。
无 rsyslog 的路径(纯 journald)
数据流:
-
内核/应用 → systemd-journald
-
存储位置:
- 默认易失 :
/run/log/journal
(重启丢失) - 持久化 :创建目录
mkdir -p /var/log/journal
并设Storage=persistent
后写入此处
- 默认易失 :
-
journalctl 查询与导出;若需远程,可用
systemd-journal-remote
、或 fluent-bit / vector / filebeat 等直接读取 journal。
常用命令:
csharp
journalctl -f # 实时
journalctl -u sshd # 按服务
journalctl -k # 仅内核
journalctl --since today # 时间范围
journalctl -o short-iso -b # 本次启动、短格式
优点:
- 原生结构化日志、索引查询快、字段丰富、压缩与限速内置。
- 组件更少,维护简单。
注意/缺点:
- 不会生成
/var/log/messages
文本;部分传统工具不兼容。 - 远程集中需额外组件(journal-remote 或日志代理)。
该如何选择?
- 需要文本文件/兼容老工具/现有 SIEM 走 syslog → 保留 rsyslog。
- 更看重结构化与简单链路 ,且上游可直接读 journal → 纯 journald + agent(fluent-bit/vector)或
journal-remote
。
常见故障点与定位思路
-
/var/log/messages
长期没更新(在"有 rsyslog"场景):rsyslog
未运行:systemctl status rsyslog
- 规则缺失/被注释:检查
*.info ... /var/log/messages
journald
未转发:ForwardToSyslog=yes
;重启systemd-journald
- Socket 未连通:
lsof -U | grep journal/syslog
- SELinux 拦截:
getenforce
;测试setenforce 0
- 磁盘/inode 满:
df -h /var/log && df -i /var/log
-
纯 journald 场景重启后日志丢失:
- 未持久化:创建
/var/log/journal
并Storage=persistent
。
- 未持久化:创建
-
重复日志:
- 同时启用
ForwardToSyslog=yes
+imjournal
+imuxsock
,要按实际选择一种路径避免重复。
- 同时启用
快速自检清单(拷贝即用)
bash
# 是否持久化 journald
test -d /var/log/journal && echo "journal: persistent" || echo "journal: volatile"
# journald 配置
grep -E '^(Storage|ForwardToSyslog)' /etc/systemd/journald.conf
# rsyslog 运行/错误
systemctl status rsyslog
journalctl -u rsyslog -n 50 --no-pager
# journald → rsyslog socket
lsof -U | grep '/run/systemd/journal/syslog'
# 写入测试
logger "smoke-test $(date)"
journalctl -n 5
tail -n 5 /var/log/messages # 有 rsyslog 时验证
典型配置范例(可直接参考)
journald:
ini
# /etc/systemd/journald.conf
[Journal]
Storage=persistent
ForwardToSyslog=yes # 仅在需要 rsyslog 的场景
RateLimitIntervalSec=30
RateLimitBurst=1000
rsyslog(最小可用):
ini
# /etc/rsyslog.d/00-basic.conf
module(load="imuxsock")
# 或用 imjournal,避免重复就不要再从 imuxsock 收
# module(load="imjournal" StateFile="imjournal.state")
# 本地落盘
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# 远程(按需)
# *.* @10.0.0.1:514
# *.* @@log.example.com:6514