logrotate通过五种方法实现日志轮转:一、修改全局配置文件;二、为服务建独立配置;三、用prerotate/postrotate控制服务行为;四、强制触发验证;五、按大小或定时自定义轮转条件。

如果您在Linux系统中运行长期服务,日志文件会持续增长,可能耗尽磁盘空间或影响排查效率。logrotate是系统默认的日志轮转工具,通过配置可实现日志自动压缩、归档与删除。以下是完成logrotate配置的多种方法:
一、修改全局配置文件 /etc/logrotate.conf
该文件定义所有日志轮转的默认行为,适用于系统级统一策略。修改后对所有包含在其中的include规则生效。
1、使用root权限打开配置文件:sudo nano /etc/logrotate.conf。
2、在文件末尾添加或调整通用参数,例如:weekly(每周轮转)、rotate 4(保留4个归档)、compress(启用gzip压缩)。
3、确认存在 include /etc/logrotate.d 行,确保子配置被加载。
二、为特定服务创建独立配置文件
将服务专属轮转规则放入 /etc/logrotate.d/ 目录,便于隔离管理且不干扰全局配置。
1、新建配置文件:sudo nano /etc/logrotate.d/myapp。
2、写入以下内容(以/var/log/myapp/app.log为例):/var/log/myapp/app.log { missingok notifempty daily rotate 7 compress delaycompress sharedscripts postrotate /bin/kill -USR1 `cat /var/run/myapp.pid 2>/dev/null` 2>/dev/null || true endscript }。
3、保存退出后,手动测试配置语法:sudo logrotate -d /etc/logrotate.d/myapp(-d表示调试模式,不实际执行)。
三、使用prerotate和postrotate脚本控制服务行为
某些服务(如nginx、rsyslog)需在日志轮转前后发送信号或重启进程,避免日志丢失或句柄残留。
1、在配置块内添加 prerotate 段,用于轮转前执行操作,例如备份原始日志头信息。
2、添加 postrotate 段,调用 /bin/kill -USR1 或 systemctl reload service-name 通知服务关闭旧日志句柄。
3、确保脚本中所有命令路径使用绝对路径,并以 endscript 结束每个段落。
四、强制触发单次轮转并验证结果
无需等待预定时间,可通过命令立即执行一次轮转,用于验证配置是否生效及输出路径是否正确。
1、运行强制轮转指令:sudo logrotate -f /etc/logrotate.d/myapp。
2、检查目标目录:ls -lt /var/log/myapp/,确认出现带日期或数字后缀的新归档文件(如 app.log.1、app.log.2.gz)。
3、查看轮转日志记录:tail -n 20 /var/lib/logrotate/status,核对最新轮转时间戳是否更新。
五、设置自定义轮转条件替代时间周期
当业务日志写入不规律时,可基于文件大小或每日固定时间触发,而非依赖weekly/daily等固定周期。
1、替换时间指令为 size 100M,表示单个日志达到100MB即触发轮转。
2、若需精确到某时刻执行,保留 daily 并配合cron调度:编辑 /etc/cron.daily/logrotate,确保其调用 /usr/sbin/logrotate /etc/logrotate.conf。
3、禁用默认cron调用时,可在配置中加入 nocompress 和 copytruncate 组合,避免服务中断(适用于无法发送信号的进程)。

















