rsyslog通过客户端条件转发与服务端模板路由实现日志远程归档和分级存储。客户端用if语句按facility、priority或programname筛选日志,以tcp可靠转发并stop防重复;服务端用imtcp接收,依$programname、$syslogseverity等变量动态生成路径,结合队列缓冲、磁盘保护及json结构化输出提升可靠性与可维护性。

Rsyslog 可以高效实现日志的远程归档与分级存储,核心在于配置日志转发规则、按内容(如 facility、priority、消息字段)做条件路由,并结合模板定义不同存储路径。关键不是简单发到一台服务器,而是让接收端根据日志属性自动分发到对应目录或文件。
配置客户端:按需筛选并转发日志
在日志产生端(客户端),使用 if 条件语句匹配日志特征,再用 @@(TCP)或 @(UDP)发送到中心服务器。推荐使用 TCP 保证可靠性。
- 只转发 auth、cron、kern 等关键 facility 的 warning 及以上级别日志:
if $syslogfacility-text == 'auth' and $syslogseverity >= 4 then @@192.168.1.100:514 - 将 nginx 访问日志(假设通过 imfile 模块读取)单独转发:
if $programname == 'nginx-access' then @@192.168.1.100:514 - 避免重复发送:加上
& stop阻止后续规则匹配:if $programname == 'nginx-access' then @@192.168.1.100:514 & stop
服务端接收:用模板区分存储路径
在中心服务器上,启用 TCP 输入模块,定义动态文件名模板,让不同来源或类型的日志写入不同目录。
- 启用 TCP 接收(/etc/rsyslog.conf 或 /etc/rsyslog.d/50-remote.conf):
module(load="imtcp")<br>input(type="imtcp" port="514")
- 定义模板,按程序名+日期生成路径:
template(name="ByProgDate" type="string" string="/var/log/remote/%PROGRAMNAME%/%$YEAR%-%$MONTH%-%$DAY%.log") - 应用模板路由(示例:所有 nginx 日志存到独立目录):
if $programname == 'nginx-access' then ?ByProgDate<br>if $programname == 'sshd' then ?ByProgDate
分级存储:按优先级或业务类型拆分归档策略
利用 rsyslog 的 property-based filter 和内置变量(如 $syslogseverity、$hostname)实现自动分级。
- 错误类日志(err 及以上)存 SSD 目录,保留 30 天:
if $syslogseverity >= 3 then /var/log/urgent/%HOSTNAME%.log - 普通 info 日志转存到大容量 NAS 路径(需挂载),每日轮转:
if $syslogseverity == 6 then /mnt/nas/logs/info/%HOSTNAME%-%$YEAR%%$MONTH%%$DAY%.log - 配合 logrotate 或 systemd-timer 定期压缩冷数据(如 7 天前的 .log → .log.gz)
增强可靠性与可维护性
生产环境需考虑断连重试、磁盘满保护、权限隔离和格式标准化。
- 启用队uing 缓冲未送达日志:
action(type="omfwd" target="192.168.1.100" port="514" protocol="tcp" queue.filename="fwq" queue.maxdiskspace="1g") - 限制单个日志文件大小,防止撑爆磁盘:
$MaxMessageSize 64k(全局) +$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat - 为不同业务日志设置独立用户/组(如 nginx-log、db-log),避免越权读写
- 在转发前统一添加结构化字段(如 JSON),便于后续接入 ELK:
template(name="JsonTemplate" type="list") {<br> constant(value="{")<br> constant(value="\"@timestamp\":\"") property(name="timereported" dateformat="rfc3339") constant(value="\",")<br> constant(value="\"host\":\"") property(name="hostname") constant(value="\",")<br> constant(value="\"msg\":\"") property(name="msg" format="json") constant(value="\"}")<br>}
不复杂但容易忽略:模板中路径不能含空格或非法字符;远程转发前务必测试防火墙和 SELinux 是否放行 514 端口;每改一次配置都要 rsyslogd -N1 校验语法,再 systemctl reload rsyslog。











