rsyslog 如何把日志通过 TCP 转发到本地 syslog 主机的指定端口(如 5000)?

rsyslog 通过 TCP 转发日志到指定主机端口:发送端用 @@host:port 配置,接收端开启 imtcp 模块监听对应端口。本文给出发送端和接收端的完整配置。

最佳实践
rsyslog 如何把日志通过 TCP 转发到本地 syslog 主机的指定端口(如 5000)?封面

发送端一行配置:*.* @@127.0.0.1:5000(@@ 表示 TCP,@ 是 UDP)。接收端需要加载 imtcp 模块并监听 5000 端口。

发送端配置

编辑 /etc/rsyslog.d/forward.conf(新建):

# 所有日志通过 TCP 转发到本地 5000 端口
*.* @@127.0.0.1:5000

语法说明:

  • *.*:所有 facility、所有级别;
  • @@:TCP 协议(@ 是 UDP);
  • 可换成具体主机名或 IP。

接收端配置(监听 5000 端口)

# /etc/rsyslog.d/receiver.conf
module(load="imtcp")
ruleset(name="remoteInput") {
    action(type="omfile" file="/var/log/remote.log")
    stop
}
input(type="imtcp" address="127.0.0.1" port="5000" ruleset="remoteInput")

生效与验证

# 两端都执行
rsyslogd -N1                    # 语法检查
sudo systemctl restart rsyslog

# 测试:发送端产生一条日志
logger "测试消息"

# 接收端确认
tail -f /var/log/remote.log

接收端也可以是观测云 DataKit 日志 Socket。此时将 rsyslog 转发地址改为实际监听地址和端口,先发送一条测试消息,核对接收端时间、主机名与内容;TCP 连接成功只证明连接建立,仍需确认消息解析和上报结果。

可靠性增强

global(workDirectory="/var/spool/rsyslog")
# 替代前面的简单转发动作,不要重复配置两条
action(type="omfwd" target="127.0.0.1" port="5000" protocol="tcp"
       queue.type="LinkedList" queue.filename="fwdRule"
       queue.maxDiskSpace="1g" queue.saveOnShutdown="on"
       action.resumeRetryCount="-1")

spool目录需事先存在、可写且持久保存;容量有限,满队列和非正常退出仍可能丢失。若同一实例本地转发,独立接收ruleset防止收到的消息再次转发形成循环;跨主机接收需显式修改监听地址并配置访问保护。

常见问题(FAQ)

Q:TCP 和 UDP 选哪个?
A:TCP 有传输层确认和重传,但不证明接收端已持久写盘。RELP提供应用层确认,端到端保证仍依赖队列、持久化和目标处理。

Q:防火墙需要开什么?
A:接收端放行 TCP 5000:sudo ufw allow 5000/tcp。

Q:只想转发部分日志?
A:把 *.* 换成过滤条件,如 :programname, isequal, "myapp" @@... 只转发 myapp 的日志。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台