rsyslog可通过动态模板按主机和应用分类存储日志:远程日志用%fromhost-ip%+%programname%,本地日志用%hostname%+%programname%,支持自动建目录与日期子目录,无需外部脚本。

直接用 Rsyslog 模板按主机和应用分类存储日志,核心是定义带动态变量的路径模板,并绑定到匹配规则。不需要额外脚本或外部工具,rsyslog 自身就能实时解析属性、自动建目录、分文件写入。
关键变量:选对属性才能精准分类
分类依赖两个核心属性:
- %FROMHOST-IP%:日志来源 IP(服务端接收远程日志时有效)
- %HOSTNAME%:本机主机名(本地日志或已正确设置 $LocalHostName 的场景)
- %PROGRAMNAME%:生成日志的程序名(如 sshd、nginx、dockerd)
- %APP-NAME%:RFC5424 格式日志中的应用名字段(比 %PROGRAMNAME% 更规范,推荐用于结构化日志)
注意:%FROMHOST-IP% 在本地日志中为空,仅适用于远程接收场景;若需统一处理本地+远程,建议在客户端显式添加 HOSTNAME 字段或使用 $!hostname 等自定义变量(需配合 mmjsonparse 或 imfile 提取)。
基础模板配置:按 IP + 应用名分离
适用于集中式日志服务器,接收多台机器日志:
$template HostAppLog,"/var/log/remote/%FROMHOST-IP%/%PROGRAMNAME%.log" *.* ?HostAppLog & ~
-
路径含义:自动创建
/var/log/remote/192.168.1.10/sshd.log、/var/log/remote/192.168.1.11/nginx.log等 - & ~ 表示匹配后终止处理,避免日志重复写入默认文件
- 确保
/var/log/remote/目录存在且 rsyslog 用户(通常是 syslog)有写权限
增强型模板:支持自动建目录与日期子目录
避免手动 mkdir,利用新版 rsyslog(v8.33+)的 dirCreateMode:
template(name="DailyHostApp" type="string" string="/var/log/remote/%FROMHOST-IP%/%PROGRAMNAME%/%$year%-%$month%-%$day%.log")
if $syslogfacility-text == 'local6' then {
action(type="omfile" template="DailyHostApp" dirCreateMode="0755" fileCreateMode="0644")
stop
}
- 每条 local6 设施的日志,自动存入
/var/log/remote/10.0.2.5/redis/2026-06-13.log - dirCreateMode="0755" 启用自动创建多级目录(如 remote/10.0.2.5/redis/)
- 时间宏
%$year%、%$month%、%$day%是内置变量,无需插件
本地日志也分类:用 HOSTNAME 替代 FROMHOST-IP
单机多服务场景(如 Docker 容器或多个应用共存),可用主机名+程序名区分:
$template LocalAppLog,"/var/log/apps/%HOSTNAME%/%PROGRAMNAME%.log" *.info;mail.none;authpriv.none;cron.none ?LocalAppLog
- 假设本机 hostname 是
web-prod-01,sshd 日志将写入/var/log/apps/web-prod-01/sshd.log - 需确认
/etc/hostname设置合理,且 rsyslog 已加载imuxsock和imklog - 如需更细粒度(如区分容器名),可配合
imfile+mmjsonparse提取日志体字段,再用%$!container_name%动态路由











