关键在于模板定义与规则路由配合:用$template定义含%programname%的路径,再通过if $programname匹配规则路由至对应模板,并手动创建目录、设置权限,配合& stop防止重复记录。

要让不同应用的日志各自写入独立目录,关键在于「模板定义 + 规则路由」两步配合。rsyslog 不直接支持按应用名自动建目录,但可通过日志内容特征(如程序名、标签、日志前缀)匹配后,用模板动态生成路径。
明确日志来源标识
应用需主动打上可识别的标记,否则无法区分。常见方式有:
- 使用 logger 命令时加
-t "myapp",例如:logger -t "nginx-access" "request from 192.168.1.5" - 在程序配置中设置 syslog facility 或 ident 字段(如 Nginx 的
error_log syslog:server=127.0.0.1:514,tag=nginx-error;) - 通过 systemd-journald 转发时,用
StandardOutput=syslog+SyslogIdentifier=myapp
配置 rsyslog 模板与路由规则
在 /etc/rsyslog.d/50-app-logs.conf 中添加:
$template AppLogPath,"/var/log/apps/%programname%.log" if $programname == 'nginx-access' then ?AppLogPath if $programname == 'nginx-error' then ?AppLogPath if $programname startswith 'redis' then ?AppLogPath if $syslogtag contains 'mysql' then ?AppLogPath & stop
说明:
-
%programname%自动提取日志中的进程名(如 nginx、redis-server) -
startswith和contains支持模糊匹配,适配不同命名习惯 -
& stop阻止日志继续落入默认规则(如 messages),避免重复记录
确保目录存在且权限正确
rsyslog 不会自动创建多级目录。需手动准备:
sudo mkdir -p /var/log/apps sudo chown syslog:adm /var/log/apps sudo chmod 755 /var/log/apps
若使用 local0–local7 自定义 facility,也可按 facility 分目录,例如:
$template Local0Path,"/var/log/apps/local0/%timegenerated%/%programname%.log" local0.* ?Local0Path
配合 logrotate 实现按应用轮转
为每个应用目录单独配置轮转,在 /etc/logrotate.d/apps 中写:
/var/log/apps/nginx-*.log {
daily
missingok
rotate 30
compress
delaycompress
sharedscripts
postrotate
systemctl kill -s HUP rsyslog.service
endscript
}注意:HUP 信号可让 rsyslog 重新打开文件句柄,避免轮转后日志写入旧文件。

















