通过配置rsyslog模板可实现日志按天切割,如定义DailyLogs模板生成形如/var/log/myapp-20250405.log的文件,结合cron定时清理7天前日志,适用于轻量级环境,但生产环境更推荐使用logrotate。

linux系统中的日志文件如果长期不处理,会变得非常大,影响系统性能和排查问题的效率。通过配置rsyslog服务,可以实现日志的自动切割与管理。下面介绍如何通过修改rsyslog配置来实现日志的按大小或时间进行切割。
理解rsyslog的基本工作原理
rsyslog是linux系统中主流的日志服务,负责收集、处理和存储系统及应用程序产生的日志信息。默认情况下,它将日志写入特定文件(如/var/log/messages、/var/log/syslog等),但不会自动切割。
要实现日志切割,可以通过以下方式:
- 使用rsyslog内置的模板和条件判断控制输出路径
- 结合外部工具如logrotate(更常用)
- 仅用rsyslog配置实现基于大小的简单切割
本文重点讲解如何仅通过修改rsyslog配置实现日志切割,适用于不想依赖logrotate或需要实时控制的场景。
通过rsyslog配置按大小切割日志
rsyslog本身不直接支持“当日志达到某个大小时自动重命名”的功能,但可以通过动态文件名 + 外部脚本监控或配合imfile模块读取应用日志并写入带编号的文件来模拟切割行为。不过最实用的方式是利用rsyslog的模板功能生成带时间戳的文件名,实现按天/小时归档。
以下是按每天生成一个日志文件的配置示例:
1. 编辑rsyslog配置文件
打开主配置文件:
sudo vim /etc/rsyslog.conf
2. 启用相关模块(如有需要)
确保加载了必要的模块:
module(load="imuxsock") # 接收本地syslog module(load="imklog") # 内核日志 module(load="mmjsonparse") # 可选:解析结构化日志
3. 定义模板实现按日期命名
在 GLOBAL DIRECTIVES 区域添加如下模板:
$template DailyLogs,"/var/log/myapp-%$YEAR%%$MONTH%%$DAY%.log" *.info ?DailyLogs
说明:
- $template DailyLogs:定义名为DailyLogs的输出模板
- %$YEAR%%$MONTH%%$DAY%:生成形如 /var/log/myapp–20250405.log 的文件
- *.info ?DailyLogs:将所有info级别以上的日志按此模板写入
4. 重启rsyslog服务
sudo systemctl restart rsyslog
此后日志将按天分割,每天生成一个新文件。
限制日志文件数量与清理旧日志
rsyslog本身无法自动删除过期日志,需配合cron任务定期清理。
创建清理脚本
sudo vim /usr/local/bin/cleanup-logs.sh
内容如下:
#!/bin/bash # 删除7天前的日志 find /var/log/myapp-*.log -mtime +7 -delete
赋予执行权限并添加定时任务
chmod +x /usr/local/bin/cleanup-logs.sh
crontab -e
添加一行:
0 3 * * * /usr/local/bin/cleanup-logs.sh
每天凌晨3点执行清理。
注意事项与建议
虽然可以通过rsyslog模板实现日志分割,但在生产环境中更推荐使用logrotate工具,因为它专为日志管理设计,支持按大小、时间轮转,并可压缩、归档、发送通知等。
如果你坚持使用rsyslog方案,请注意:
- 避免频繁写入大量小文件,影响性能
- 确保磁盘有足够的空间存放历史日志
- 定期检查日志路径权限,防止写入失败
- 结合systemd-journald时注意日志重复问题
基本上就这些。通过合理配置rsyslog模板,完全可以实现基础的日志切割需求,尤其适合嵌入式设备或轻量级服务器环境。对于复杂场景,还是建议搭配logrotate使用。