You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在远程rsyslog中显示客户端IP而非主机名(syslog-ng客户端)

问题:syslog-ng客户端向rsyslog服务器发送日志时无法正确显示客户端IP(总是显示127.0.0.1)

环境与背景

  • 客户端:部署syslog-ng,需向远程rsyslog服务器发送日志
  • 服务器:仅部署rsyslog,无法安装syslog-ng
  • 需求:区分多台物理机日志来源,期望日志格式为:
    day date time `客户端IP地址`  syslog-ng.service: Succeeded.
    

已尝试的无效配置

  1. 修改客户端syslog-ng全局选项:

    options { 
    keep_hostname(yes);
    create_dirs(no);
    use_dns(no);
    };
    

    仅当主机名改为IP时生效,不符合需求。

  2. 使用客户端模板:

    template("$(ISODATE) $(FULLHOST_FROM) $(SOURCEIP) $(HOST) $(HOSTNAME) ${PROGRAM}: ${MESSAGE}\n")
    

    IP显示在消息段而非主机位置,且SOURCEIP为回环地址127.0.0.1。

  3. 使用客户端结构化日志改写规则:

    rewrite r_sourceip{
    set('${SOURCEIP}' value(HOST));
    };
    log { source(s_local); rewrite(r_sourceip);destination(d_syslog_tcp); };
    

    仍显示回环IP。

  4. 尝试在客户端安装rsyslog,因系统版本问题报错(如add apt repository command not found),无法完成。

  5. 服务器端使用模板:

    $template DynaFile,"/var/log/%FROMHOST-IP%/%syslogfacility-text%.log"
    *.* -?DynaFile
    

    仅按主机名创建日志文件夹,不符合需求。

原因分析

  • SOURCEIP显示为127.0.0.1是因为客户端的日志源(s_local)来自本地unix socket或/dev/log,这类本地来源的日志,syslog-ng会默认标记源IP为回环地址,并非真实的客户端外网/局域网IP。
  • 服务器端%FROMHOST-IP%未生效,大概率是rsyslog默认开启了DNS反向解析,将客户端IP解析为主机名,导致按主机名创建目录。

解决方案

客户端配置调整(syslog-ng)

目标:手动将日志的HOST字段设置为客户端真实IP,确保发送到服务器的日志携带正确的IP标识。

  1. 修改syslog-ng全局选项:

    options {
        keep_hostname(no); # 允许改写HOST字段
        create_dirs(no);
        use_dns(no);
    };
    
  2. 添加rewrite规则,设置HOST为客户端真实IP(二选一即可):

    • 静态指定IP(适合固定IP的客户端):
      rewrite r_set_real_host {
          set("192.168.1.10" value("HOST")); # 替换为客户端真实IP
      };
      
    • 动态获取IP(适合DHCP客户端,以eth0网卡为例):
      rewrite r_set_real_host {
          set("$(exec ip addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')" value("HOST"));
      };
      
  3. 配置发送目标与日志路径:

    destination d_rsyslog_server {
        tcp("你的rsyslog服务器IP" port(514) template("$(ISODATE) $(HOST) ${PROGRAM}: ${MESSAGE}\n"));
    };
    
    log {
        source(s_local);
        rewrite(r_set_real_host);
        destination(d_rsyslog_server);
    };
    
  4. 重启syslog-ng服务:

    systemctl restart syslog-ng
    

服务器端配置调整(rsyslog)

目标:禁用DNS解析,强制使用客户端的连接IP来区分日志来源,并按IP创建日志目录。

  1. 启用TCP接收模块(确保已开启):

    $ModLoad imtcp
    $InputTCPServerRun 514
    
  2. 禁用DNS解析相关选项:

    $PreserveFQDN off
    $UseDNS no
    $UseMsgFQDN no
    
  3. 配置动态日志路径模板:

    $template DynaFile,"/var/log/%FROMHOST-IP%/%syslogfacility-text%.log"
    *.* -?DynaFile
    
  4. 确保日志目录权限正确:

    mkdir -p /var/log/
    chown syslog:adm /var/log/
    
  5. 重启rsyslog服务:

    systemctl restart rsyslog
    

验证

在服务器端查看日志文件,应能看到按客户端IP命名的目录,日志格式符合期望:

day date time `客户端IP地址`  syslog-ng.service: Succeeded.

内容的提问来源于stack exchange,提问作者error

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 10:36:59