journalctl 是 systemd-journald 的查询前端,不发送日志;真正负责采集、过滤与转发的是 systemd-journald(内建)或 rsyslog 等服务;推荐方案是 systemd-journald 通过 imjournal 模块将日志交给 rsyslog,再由 rsyslog 通过 TCP/UDP 可靠转发至远程服务器。

journalctl 本身不直接发送日志——它是 systemd-journald 的查询前端,只负责读取和显示本地日志。真正负责日志采集、过滤与转发的是 systemd-journald(内建)或配合 rsyslog/syslog-ng 等传统日志服务。
要将 journal 日志可靠地发送到远程服务器,主流且推荐的方式是:
✅ 让 systemd-journald 将日志转发给本地 rsyslog,再由 rsyslog 负责远程 TCP/UDP 传输
(这是官方支持、稳定、可审计、支持 TLS 加密的方案)
一、启用 journald → rsyslog 的日志桥接
systemd 默认已通过 /run/systemd/journal/syslog 套接字将结构化日志转发给 rsyslog(需 rsyslog 启用 imjournal 模块)。
检查并启用 imjournal 模块(接收端 & 发送端都需配置)
# 编辑 rsyslog 配置 sudo nano /etc/rsyslog.conf
确保以下两行未被注释(RHEL/CentOS 8+/Ubuntu 20.04+ 默认已启用):
module(load="imjournal") input(type="imjournal" PersistStateFile="imjournal.state")
⚠️ 注意:
imjournal是单向桥接模块,它让 rsyslog 从 journald 读取日志(而非反向)。所以这步必须在每台需要转发日志的客户端机器上做。
重启服务生效
sudo systemctl restart systemd-journald rsyslog
验证是否成功接入:
# 查看 rsyslog 是否正从 journald 读取 sudo journalctl -u rsyslog -n 20 | grep -i "imjournal" # 应看到类似:imjournal: journal started, entries read: ...
二、配置 rsyslog 远程转发(客户端)
在客户端(即产生日志的机器)上添加转发规则:
# 新建配置文件(推荐,避免修改主配置) sudo tee /etc/rsyslog.d/10-remote-journal.conf <<'EOF' # 将所有 journal 日志(经 imjournal 接入后)转发到远程服务器 *.* @@192.168.10.100:514 # TCP(推荐,可靠、防丢包) # 或用 UDP(不推荐生产环境):*.* @192.168.10.100:514 EOF
-
@@表示 TCP;单个@表示 UDP -
192.168.10.100替换为你的日志服务器 IP - 端口
514是 syslog 标准端口,可自定义(需两端一致)
重启生效:
sudo systemctl restart rsyslog
三、配置日志服务器(接收端)
1. 启用 UDP/TCP syslog 输入
编辑 /etc/rsyslog.conf 或新建 /etc/rsyslog.d/10-listen.conf:
# 启用 TCP 和/或 UDP 监听(按需选) module(load="imtcp") input(type="imtcp" port="514") module(load="imudp") input(type="imudp" port="514")
2. 定义接收模板(按主机/IP 分目录存储)
# 在 GLOBAL DIRECTIVES 区域前添加模板 $template RemoteJournal,"/var/log/remote/%FROMHOST-IP%/%PROGRAMNAME%.log" *.* ?RemoteJournal & stop
-
%FROMHOST-IP%自动提取发送方 IP -
& stop阻止日志重复写入本地/var/log/messages - 目录会自动创建(需确保
/var/log/remote存在且 rsyslog 有写权限)
3. 创建目录并授权
sudo mkdir -p /var/log/remote sudo chown -R syslog:syslog /var/log/remote # Debian/Ubuntu # 或 sudo chown -R root:root /var/log/remote # RHEL/CentOS(rsyslog 运行用户常为 root)
重启服务:
sudo systemctl restart rsyslog
四、安全与连通性检查(关键!)
-
? 防火墙放行(客户端发 + 服务端收):
sudo firewall-cmd --permanent --add-port=514/tcp sudo firewall-cmd --reload
-
?️ SELinux(仅 RHEL/CentOS):
sudo setsebool -P rsyslog_can_write_logfiles on sudo setsebool -P rsyslog_forward on
-
? 测试连通性(从客户端执行):
echo "test journal forward" | logger -t testjourn # 然后立刻在服务端查看: sudo tail -f /var/log/remote/<客户端IP>/testjourn.log
✅ 补充说明:为什么不直接用 journald 的 ForwardToSyslog=yes?
systemd-journald 确实支持 ForwardToSyslog=yes(在 /etc/systemd/journald.conf 中),但该选项仅控制是否把日志写入 /dev/log 套接字供传统 syslog 服务读取,它本身不实现网络传输。真正完成远程发送的仍是 rsyslog —— 所以你仍需配置 rsyslog 的转发规则。
? 简单说:
journald → (via /dev/log or imjournal) → rsyslog → (via @@) → remote server
不复杂但容易忽略。核心就三步:
① 让 journald 可被 rsyslog 读取(imjournal)
② 让 rsyslog 把读到的日志发出去(@@IP:port)
③ 让远端 rsyslog 接得住、存得对(监听 + 模板 + 权限)


















