rsyslog 如何把日志通过 TCP 转发到本地 syslog 主机的指定端口(如 5000)?
rsyslog 通过 TCP 转发日志到指定主机端口:发送端用 @@host:port 配置,接收端开启 imtcp 模块监听对应端口。本文给出发送端和接收端的完整配置。
发送端一行配置:*.* @@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 的日志。