rsyslog 通过模板嵌入 %$year%%$month%%$day% 等动态时间变量实现每日生成独立日志文件,配合 dynafile 和目录预创建机制完成按天分流,无需重启即可自动切换日期目录。

rsyslog 的 omfile 模块本身不支持“自动按天建新文件”的智能判断,但可通过模板(template)配合内置时间属性实现**每日生成独立日志文件**的效果。关键在于:文件名中嵌入动态时间变量,让每条日志写入当天命名的文件,系统自然完成“按天分流”。
用时间模板定义动态文件路径
在 /etc/rsyslog.d/ 下新建配置(如 99-business-logs.conf),定义一个含日期的模板:
$template BizDaily,"/var/log/business/%$YEAR%%$MONTH%%$DAY%/%programname%.log"- 其中
%$YEAR%%$MONTH%%$DAY%是 rsyslog 内置运行时变量,每次写入时自动替换为当前日期(如20260522) -
%programname%取自日志原始字段,可区分不同业务进程(如nginx、redis、myapp) - 目录结构带日期子目录(
/var/log/business/20260522/),避免单日文件过多混杂
绑定模板到匹配规则
使用过滤器筛选目标日志,并指定输出动作:
if $syslogfacility-text == 'local1' and $programname != '' then {action(type="omfile" dynaFile="BizDaily")stop}- 这里限定 facility 为
local1(业务程序需用logger -p local1.info发日志),且programname非空,防止空名写入失败 -
dynaFile="BizDaily"表示启用动态文件名;stop阻止后续规则重复处理
确保目录可写并自动创建
rsyslog 不会自动创建多级目录,需提前准备或借助外部机制:
- 手动创建基础目录:
sudo mkdir -p /var/log/business - 设置属主与权限:
sudo chown syslog:adm /var/log/business(适配 rsyslog 运行用户) - 若需自动建当日子目录,可在 cron 中每小时执行一次:
mkdir -p /var/log/business/$(date +\%Y\%m\%d) - 注意:rsyslog 以守护进程方式运行,不会执行 shell 命令,目录必须存在才能写入
验证与维护要点
配置生效后需检查实际行为是否符合预期:
- 重启服务:
sudo systemctl restart rsyslog - 发送测试日志:
logger -p local1.info -t myapp "test message" - 确认生成路径:
ls -l /var/log/business/$(date +%Y%m%d)/myapp.log - 次日零点后,新日志将自动写入新目录(如
/var/log/business/20260523/),无需重启 - 旧日志文件不会自动压缩或清理,建议搭配
logrotate或自定义 cron 脚本归档











