You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何配置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

火山引擎 最新活动