核心是客户端加转发规则、服务端开监听并分类存储:客户端用@@tcp可靠转发(如. @@192.168.5.200:514)或按程序名精准匹配(if $programname=='nginx' then...& ~),本地日志不受影响;服务端加载imtcp模块监听514端口,用template按%fromhost-ip%/%programname%自动分目录存储,需提前创建/var/log/remote并授权,重启rsyslog生效。

要让 Linux 本地日志可靠地发到远端服务器,核心是客户端加转发规则、服务端开监听并分类存储,不干扰原有本地日志路径,也不依赖应用改代码。
客户端:只加一行转发,不删不替本地记录
在 /etc/rsyslog.d/50-remote.conf(推荐独立文件,数字靠后确保优先)中写入:
-
TCP 可靠转发(生产首选):
*.* @@192.168.5.200:514——@@表示 TCP,比 UDP 不丢日志;IP 和端口必须能通(telnet 192.168.5.200 514可测) -
按程序名精准转发(如只要 nginx):
if $programname == 'nginx' then @@192.168.5.200:514 & ~——& ~表示匹配后不再走后续规则,但本地日志照常写入/var/log/ -
防火墙放行:运行
sudo ufw allow 514/tcp(Ubuntu)或sudo firewall-cmd --permanent --add-port=514/tcp && sudo firewall-cmd --reload(RHEL 系)
服务端:按来源隔离存日志,避免混成一锅粥
在远端服务器的 /etc/rsyslog.d/50-listen.conf 中配置:
-
启用 TCP 接收:
module(load="imtcp") input(type="imtcp" port="514") -
按客户端 IP + 应用名自动分目录(v8.20+ 新语法):
template(name="ByHostApp" type="string" string="/var/log/remote/%FROMHOST-IP%/%PROGRAMNAME%.log")<br>*.* action(type="omfile" template="ByHostApp")
-
提前建好目录并授权:
sudo mkdir -p /var/log/remote && sudo chown syslog:adm /var/log/remote
验证与排错关键点
改完配置后,必须重启服务:sudo systemctl restart rsyslog(reload 不生效)。
-
客户端测试:
logger -t testapp "hello remote",再查远端/var/log/remote/客户端IP/testapp.log是否有内容 -
服务端确认监听:
ss -tlnp | grep :514应看到 rsyslog 进程在 LISTEN -
常见失败原因:客户端连不上(网络/防火墙)、服务端没加载 imtcp 模块、模板路径目录没创建或权限不对、rsyslog 版本差异导致 TLS 自动启用(老服务端可加
$InputTCPServerStreamDriverMode 1关闭)











