如何在远程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.
已尝试的无效配置
修改客户端syslog-ng全局选项:
options { keep_hostname(yes); create_dirs(no); use_dns(no); };仅当主机名改为IP时生效,不符合需求。
使用客户端模板:
template("$(ISODATE) $(FULLHOST_FROM) $(SOURCEIP) $(HOST) $(HOSTNAME) ${PROGRAM}: ${MESSAGE}\n")IP显示在消息段而非主机位置,且
SOURCEIP为回环地址127.0.0.1。使用客户端结构化日志改写规则:
rewrite r_sourceip{ set('${SOURCEIP}' value(HOST)); }; log { source(s_local); rewrite(r_sourceip);destination(d_syslog_tcp); };仍显示回环IP。
尝试在客户端安装rsyslog,因系统版本问题报错(如
add apt repository command not found),无法完成。服务器端使用模板:
$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标识。
修改syslog-ng全局选项:
options { keep_hostname(no); # 允许改写HOST字段 create_dirs(no); use_dns(no); };添加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")); };
- 静态指定IP(适合固定IP的客户端):
配置发送目标与日志路径:
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); };重启syslog-ng服务:
systemctl restart syslog-ng
服务器端配置调整(rsyslog)
目标:禁用DNS解析,强制使用客户端的连接IP来区分日志来源,并按IP创建日志目录。
启用TCP接收模块(确保已开启):
$ModLoad imtcp $InputTCPServerRun 514禁用DNS解析相关选项:
$PreserveFQDN off $UseDNS no $UseMsgFQDN no配置动态日志路径模板:
$template DynaFile,"/var/log/%FROMHOST-IP%/%syslogfacility-text%.log" *.* -?DynaFile确保日志目录权限正确:
mkdir -p /var/log/ chown syslog:adm /var/log/重启rsyslog服务:
systemctl restart rsyslog
验证
在服务器端查看日志文件,应能看到按客户端IP命名的目录,日志格式符合期望:
day date time `客户端IP地址` syslog-ng.service: Succeeded.
内容的提问来源于stack exchange,提问作者error
相关产品推荐
相关产品推荐

