rsyslog多服务器日志汇总与分类存储需配置服务端接收(启用imtcp/imudp模块、定义remotetemplate模板按ip分目录)和客户端转发(omfwd模块发至服务端),再通过programname等条件二次路由至nginxlog/authlog等模板,并授权syslog用户目录权限及配置logrotate轮转。

用 rsyslog 实现多台服务器日志汇总与分类存储,核心在于配置好日志接收端(服务端)和发送端(客户端),并利用 rsyslog 的模板、规则集和动态文件名功能,把不同来源、不同类型的日志分目录、分文件存储。
服务端:启用 UDP/TCP 接收并按来源主机分类
在集中日志服务器上,需开启网络接收,并为每台客户端创建独立目录结构。推荐使用 TCP(更可靠)或 UDP(低开销),避免混用导致丢日志。
- 编辑 /etc/rsyslog.conf 或新建 /etc/rsyslog.d/01-remote.conf,启用模块:
module(load="imtcp") input(type="imtcp" port="514") module(load="imudp") input(type="imudp" port="514")
- 定义模板,按客户端 IP 和程序名生成路径:
template(name="RemoteTemplate" type="string" string="/var/log/remote/%fromhost-ip%/syslog-%$YEAR%-%$MONTH%-%$DAY%.log")
- 应用规则:所有远程日志走该模板
*.* ?RemoteTemplate
- 重启 rsyslog:systemctl restart rsyslog
客户端:按需转发日志到服务端
每台业务服务器需配置为日志发送方。默认只发本机 syslog,如需转发 auth、cron、nginx 等,需额外声明。
- 启用转发模块(通常已加载):
module(load="omfwd")
- 设置全局转发目标(TCP 更稳):
*.* action(type="omfwd" target="192.168.1.100" port="514" protocol="tcp" queue.size="10000")
- 若只想转发特定设施(如 nginx 错误日志),先配置其输出到 rsyslog,再单独转发:
# 在 nginx 配置中写入: error_log syslog:server=127.0.0.1:514,facility=local7,tag=nginx; <h1>在 rsyslog 客户端加规则:</h1><p>local7.* action(type="omfwd" target="192.168.1.100" port="514" protocol="tcp")</p>
按应用类型进一步分类存储
服务端收到日志后,可基于 $programname、$syslogfacility-text 或自定义 tag(如 nginx 的 tag=nginx)做二次路由。
- 定义多个模板,区分应用:
template(name="NginxLog" string="/var/log/remote/%fromhost-ip%/nginx-%$YEAR%-%$MONTH%-%$DAY%.log") template(name="AuthLog" string="/var/log/remote/%fromhost-ip%/auth-%$YEAR%-%$MONTH%-%$DAY%.log")
- 用 if 条件匹配并写入对应路径:
if $programname == 'nginx' then ?NginxLog & stop <p>if $syslogfacility-text == 'auth' then ?AuthLog & stop</p>
- & stop 表示匹配后不再继续处理,避免重复写入
权限与轮转管理
自动创建的目录和文件属主默认是 root:adm,但 rsyslog 进程以 syslog 用户运行,需提前授权。
- 创建基础目录并设权:
mkdir -p /var/log/remote chown -R syslog:syslog /var/log/remote chmod 755 /var/log/remote
- 配合 logrotate 管理归档(示例配置 /etc/logrotate.d/rsyslog-remote):
/var/log/remote/*/*.log {
daily
missingok
rotate 30
compress
delaycompress
sharedscripts
create 644 syslog syslog
}











