如何将远程syslog/journal日志存储为按主机划分的独立journal日志?
我来帮你梳理下可行的方案,结合你尝试过的思路,其实有两种比较直接的实现方式,能满足你把不同客户端的日志存成独立journal的需求:
方案一:用rsyslog统一处理所有日志(兼容syslog和journald客户端)
这个方案能同时接收传统syslog客户端和journald转发过来的日志,然后按主机拆分存储到独立journal目录:
服务器端rsyslog配置
首先确保rsyslog加载了必要的模块,然后设置监听和按主机转发的规则:编辑rsyslog主配置文件(比如
/etc/rsyslog.conf或/etc/rsyslog.d/remote.conf),添加以下内容:# 加载TCP接收模块和journal输出模块 module(load="imtcp") module(load="omjournal") # 监听514端口接收远程syslog(默认syslog端口) input(type="imtcp" port="514") # 定义动态路径模板:按主机名生成journal存储目录 template(name="HostJournalDir" type="string" string="/var/log/journal/remote/%hostname%/") # 将日志按主机写入对应目录的独立journal action( type="omjournal" StoragePath="HostJournalDir" StateFile="omjournal-remote-hosts" CreatePath="on" # 自动创建不存在的目录 )注意:要给
/var/log/journal/remote/目录设置正确的权限,执行以下命令:mkdir -p /var/log/journal/remote chown root:systemd-journal /var/log/journal/remote chmod 2755 /var/log/journal/remote这样rsyslog才能顺利创建每个主机的子目录并写入日志。
客户端配置
- 传统syslog客户端:配置syslog/rsyslog用
omfwd模块把日志转发到服务器的514端口,比如在客户端rsyslog配置里加:action(type="omfwd" target="你的日志服务器IP" port="514" protocol="tcp") - journald客户端:让journald直接转发日志到rsyslog服务器,编辑
/etc/systemd/journald.conf,设置:
重启journald服务生效:ForwardToSyslog=yes SyslogAddress=tcp://你的日志服务器IP:514systemctl restart systemd-journald
- 传统syslog客户端:配置syslog/rsyslog用
方案二:用systemd-journal-remote接收journald日志,rsyslog中转syslog日志
如果想让journald客户端的日志直接以原生journal格式传输(更高效,保留更多元数据),可以用journal-remote处理journald客户端,rsyslog处理传统syslog客户端:
服务器端配置journal-remote
- 安装systemd-journal-remote(大部分发行版默认已包含),编辑
/etc/systemd/journal-remote.conf:[Remote] SplitMode=host # 按主机拆分日志 StoragePath=/var/log/journal/remote/ # 存储目录 ListenStream=19532 # 监听端口(journal-remote默认端口) - 启动并启用服务:
systemctl enable --now systemd-journal-remote.socket systemd-journal-remote.service
- 安装systemd-journal-remote(大部分发行版默认已包含),编辑
journald客户端配置
编辑/etc/systemd/journald.conf,设置直接转发到journal-remote:ForwardToRemote=yes RemoteJournalTransport=tcp RemoteAddress=你的日志服务器IP:19532重启journald生效。
传统syslog客户端处理
还是用方案一里的rsyslog配置,把syslog日志转存到对应主机的journal目录,这样所有日志最终都按主机存在/var/log/journal/remote/下的独立目录/文件里。
解决你之前遇到的问题
你之前用imtcp+omjournal时日志都存在服务器自己的journal里,是因为没指定StoragePath参数,omjournal默认会写入服务器本地的系统journal。只要加上StoragePath并按主机动态生成路径,就能实现独立存储了。
备注:内容来源于stack exchange,提问作者mwied

