rsyslog可通过模板+属性过滤按IP段分目录存日志实现多租户隔离:需启用imudp/imtcp模块监听514端口,用$template TenantLogs,"/var/log/tenant-%$!fromhost-ip:R,2:16%%/%PROGRAMNAME%.log"提取网段为目录名,配合if $fromhost-ip startswith做精确路由,并提前创建目录、设置syslog:adm权限。

直接用 rsyslog 的模板 + 属性过滤功能,就能按 IP 地址段把日志分目录存放,天然支持多租户隔离。关键不是“写脚本”,而是定义好日志来源标识、模板路径和权限控制。
启用网络输入模块并监听端口
rsyslog 默认不监听远程日志,必须显式加载 UDP/TCP 输入模块:
- 编辑 /etc/rsyslog.conf,取消以下两行注释:
module(load="imudp")<br>module(load="imtcp")
- 在模块下方添加监听规则(建议同时开 TCP,更可靠):
input(type="imudp" port="514")<br>input(type="imtcp" port="514")
- 保存后重启服务:systemctl restart rsyslog
定义IP段识别模板与分类路径
不能只靠 %FROMHOST-IP% 原样建目录(如 /var/log/192.168.5.10/),否则大量小IP会撑爆目录结构。应提取网段作为一级目录:
- 在配置文件中添加模板(以
192.168.0.0/16和10.10.0.0/16为例):
$template TenantLogs,"/var/log/tenant-%$!fromhost-ip:R,2:16%%/%PROGRAMNAME%.log"<br>*.* ?TenantLogs & stop
- 说明:
R,2:16表示对 IP 做正则截取第2段起共16位字符,实际效果是提取前两个八位组(如192.168);你也可改用R,1:10提取前10字符(192.168.5)适配 /24 段 - 若需更精确匹配,可用 property-based filter 配合 if-then 结构:
if $fromhost-ip startswith '192.168.10.' then /var/log/tenant-web/%PROGRAMNAME%.log<br>if $fromhost-ip startswith '192.168.20.' then /var/log/tenant-db/%PROGRAMNAME%.log<br>& stop
自动创建目录并设置租户级权限
rsyslog 不会自动创建多级目录,且默认以 syslog 用户写入,需提前准备:
- 批量创建常用网段目录(例如):
sudo mkdir -p /var/log/tenant-192.168.10 /var/log/tenant-192.168.20 /var/log/tenant-10.10<br>sudo chown -R syslog:adm /var/log/tenant-*
- 为安全审计强化,对 authpriv 日志单独处理并收紧权限:
$template SecureTenant,"/var/log/tenant-%$!fromhost-ip:R,2:16%%/auth.log"<br>:programname, isequal, "sshd" ?SecureTenant<br>& ~<br>sudo chmod 640 /var/log/tenant-*/auth.log<br>sudo chown syslog:adm /var/log/tenant-*/auth.log
客户端侧配合:确保发送端携带真实源IP
如果 VPS 经过 NAT 或反向代理,$fromhost-ip 会变成网关或负载均衡器地址,导致归类失效:
- 确保客户端 rsyslog 使用
@@(TCP)并启用forwarding模式,避免中间设备篡改 HOST 字段 - 若必须走 NAT,在网关层开启
syslog-ng或 rsyslog 的normalize模块解析 X-Forwarded-For - 海外 VPS 客户端配置示例(/etc/rsyslog.conf):
*.* @@logs.example.com:514 # TCP 转发<br>$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat











