如何配置Syslog-ng将接收的日志转发至本机多端口供应用接收?
单端口接收日志并分发至多个应用的配置方案
当然可以!完全不用修改源端的Syslog/rsyslog配置(不用让它们发多个端口),只需要在你的中央Syslog服务器上做转发规则配置,就能把单端口接收的日志同时复制分发给三个应用。下面以最常用的rsyslog为例,给出具体实现步骤:
1. 确保中央服务器的rsyslog已加载必要的输入模块
首先要确保rsyslog监听了默认的Syslog端口(比如514 UDP/TCP),在/etc/rsyslog.conf或/etc/rsyslog.d/下的配置文件中添加以下内容,开启端口接收:
# 加载UDP接收模块,监听514端口 module(load="imudp") input(type="imudp" port="514") # 加载TCP接收模块,监听514端口(可选,根据源端的传输协议选择) module(load="imtcp") input(type="imtcp" port="514")
2. 配置日志分发规则
核心思路是:把中央服务器接收到的日志,同时转发给三个应用的接收端点。不同应用的接收方式可能不同,这里列举几种常见场景的配置:
场景示例:三个应用的接收方式分别为
- 应用1:读取本地日志文件
- 应用2:通过Unix域套接字接收
- 应用3:通过本地TCP端口接收
你可以在配置文件中添加以下规则(建议单独在/etc/rsyslog.d/distribute.conf中创建,便于管理):
# 可选:定义统一的日志格式模板,确保分发到各应用的日志格式一致 $template StandardLogFormat,"%timestamp:::date-rfc3339% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n" # 定义规则组,集中处理日志分发逻辑 ruleset(name="centralLogDistribution") { # 分发给应用1:写入指定日志文件 *.* /var/log/centralized_app1.log;StandardLogFormat # 分发给应用2:转发到Unix域套接字(需确保应用2已监听该套接字,且rsyslog进程有读写权限) *.* action(type="omunixsock" socket="/run/app2_log.sock" template="StandardLogFormat") # 分发给应用3:转发到本地TCP端口(需确保应用3已监听127.0.0.1:1514) *.* action(type="omfwd" target="127.0.0.1" port="1514" protocol="tcp" template="StandardLogFormat") } # 将UDP/TCP的输入流量绑定到上述规则组 input(type="imudp" port="514" ruleset="centralLogDistribution") input(type="imtcp" port="514" ruleset="centralLogDistribution")
3. 针对特定日志的定向分发(可选)
如果三个应用需要接收不同类型的日志(比如应用1只收nginx日志,应用2只收数据库日志),可以通过rsyslog的过滤器实现:
ruleset(name="centralLogDistribution") { # 应用1:只接收nginx的日志 if $programname == 'nginx' then /var/log/nginx_central.log;StandardLogFormat # 应用2:只接收MySQL的日志 if $programname == 'mysql' then action(type="omunixsock" socket="/run/db_app.sock" template="StandardLogFormat") # 应用3:接收所有剩余日志 *.* action(type="omfwd" target="127.0.0.1" port="1514" protocol="tcp" template="StandardLogFormat") }
4. 生效配置并验证
配置完成后,重启rsyslog服务:
systemctl restart rsyslog
然后可以通过tcpdump或查看应用的日志接收情况,验证是否所有应用都能拿到日志副本。
如果你的中央服务器用的是syslog-ng,思路也是类似的:定义一个source(监听514端口),然后创建多个destination,最后用log语句把source关联到所有destination即可。
内容的提问来源于stack exchange,提问作者Abhijit Mishra




