如何将rsyslog日志配置发送至指定端口?
解决rsyslog无法将日志发送到指定端口的问题
我来帮你一步步排查这个rsyslog日志发送失效的问题,大概率是配置细节或者依赖模块没到位:
1. 先修正配置语句的语法错误
你写的 . @localhost:47111格式有问题,rsyslog的规则格式是选择器 + 动作,不能有多余的前导空格和点。举几个正确的例子:
- 发送所有日志到UDP端口47111:
*.* @localhost:47111 - 发送所有日志到TCP端口47111:
*.* @@localhost:47111(注意这里是两个@,代表TCP协议) - 只发送auth相关日志到UDP端口:
auth.* @127.0.0.1:47111
2. 确认加载了必要的输出模块
rsyslog发送网络日志需要对应的输出模块支持,你得在配置文件开头加上对应的加载语句:
- 如果用UDP发送:
module(load="omudp") - 如果用TCP发送:
module(load="omtcp")
默认情况下rsyslog可能没加载这些模块,不加载的话发送动作直接失效。
3. 检查配置加载顺序与服务重启
- 建议把你的自定义发送规则放到
/etc/rsyslog.d/目录下,新建一个比如90-send-to-port.conf的文件(数字越大,加载顺序越靠后,能覆盖前面的默认规则),而不是直接改主配置文件,这样更规范。 - 修改完配置后必须重启rsyslog服务,不然配置不会生效:
重启后可以用sudo systemctl restart rsyslogsudo systemctl status rsyslog检查服务是否正常启动,有没有报错信息。
4. 排查监听端与网络连通性
- 先确认你的目标Daemon确实在监听47111端口,用这个命令查看:
如果看不到任何监听进程,那问题出在Daemon端,先确保它正常启动并监听正确端口。ss -tulpn | grep 47111 - 可以用
nc工具快速测试端口连通性:- UDP测试:
nc -u localhost 47111,输入任意内容回车,看Daemon能不能收到 - TCP测试:
nc localhost 47111,同样输入内容测试
- UDP测试:
- 查看rsyslog自身的日志,找错误线索:
重启rsyslog后如果有发送失败的报错(比如连接超时、无法找到服务器),能直接帮你定位问题。tail -f /var/log/syslog
5. 检查SELinux或防火墙的限制
- 如果是带SELinux的系统(比如CentOS、RHEL),它可能阻止rsyslog发起网络连接,临时关闭测试:
如果关闭后日志能正常发送,就需要配置SELinux规则允许rsyslog的网络行为。sudo setenforce 0 - 本地防火墙(比如ufw、firewalld)虽然对localhost访问限制较少,但也可以临时关闭测试,排除防火墙拦截的可能。
内容的提问来源于stack exchange,提问作者Nikhil S




