概述:
logrotate 是 Linux 系统下的日志管理工具,用于自动 “轮转(rotate)” 日志文件 —— 即按规则切割、压缩、删除旧日志,防止单一日志文件过大占用磁盘空间,同时保留历史日志供分析。
工作原理:
1,触发条件:按照时间(月/周/天)或者文件大小
2,工作过程:
1,重命名当前文件:access.log --> access.log.1
2,创建新的日志文件:access.log
3,压缩日志文件:access.log.1 --> access.log.1.tar.gc
4,删除过期文件
5,执行自定义脚本
3,配置文件结构:
主文件:/etc/logrotate.conf:定义全局规则(如默认保留周期、压缩方式),并通过 include 加载子配置:
weekly # 每周轮转
rotate 4 # 保留最近4个轮转日志
create # 轮转后创建新空日志
compress # 压缩旧日志
include /etc/logrotate.d # 加载自定义子配置(每个应用一个文件)
二级目录:/etc/logrotate.d/:这个,目录下可创建对应服务文件:例:/etc/logrotate.d/nginx
4,常用格式及配置参数:
/path/to/logfile
{ 规则1
规则2 ...
}
1. 轮转触发条件
daily:每天轮转
weekly:每周轮转
monthly:每月轮转
size 100M:文件达到 100MB 时轮转
2. 轮转后处理
rotate 7:保留最近 7 个轮转日志(超过则删除最旧的)
compress:用 gzip 压缩旧日志(如 access.log.1 → access.log.1.gz)
delaycompress:推迟压缩到下次轮转(避免压缩正在写入的日志)
missingok:日志文件不存在时不报错
notifempty:日志为空时不轮转
create 0644 nginx nginx:创建新日志并指定权限(644)、所有者(nginx)、组(nginx)
3. 脚本执行(关键:服务重启 / 日志重开)
prerotate/endscript:轮转前执行的脚本(如备份旧日志)
postrotate/endscript:轮转后执行的脚本(如通知 Nginx 重新打开日志)
4. 其他参数
dateext:轮转文件名加日期后缀(如 access.log-20250901)
olddir /var/log/archive:将旧日志移动到指定目录
copytruncate:复制原日志后截断(适合无法重启的服务,如某些老旧应用)
命令示例:

运行:
每天系统运行,也可以定义:
crontab -e # 添加一行:0 * * * * /usr/sbin/logrotate /etc/logrotate.conf
实战:
/var/log/nginx/*.log {
daily # 每天轮转
rotate 7 # 保留7天
compress # 压缩旧日志
delaycompress # 推迟到下次轮转再压缩
missingok # 日志不存在不报错
notifempty # 空日志不轮转
create 0644 nginx nginx # 新日志权限
sharedscripts # 所有日志轮转后只执行一次脚本
postrotate # 轮转后通知Nginx重新打开日志
/usr/sbin/nginx -s reopen
endscript
}
/var/log/myapp/app.log {
size 100M # 超过100MB时轮转
rotate 5 # 保留5个日志
dateext # 文件名加日期后缀(如app.log-20250901)
compress # 压缩
missingok # 忽略不存在的文件
copytruncate # 复制后截断原文件(适合无法重启的服务)
}
/var/log/syslog {
monthly # 每月轮转
rotate 12 # 保留12个月
compress # 压缩
olddir /var/log/archive # 旧日志移动到归档目录
maxage 365 # 删除超过365天的日志
missingok # 忽略不存在
notifempty # 空日志不轮转
create 0640 root adm # 新日志权限(root:adm)
}
注意:
1,如果自定义定时任务启动,可能回合系统自动执行的logrotate任务重复,造成日志重复的情况,
避免操作:
系统默认的 logrotate 任务由 /etc/cron.daily/logrotate 触发,需重命名该文件使其失效(保留备份,便于后续恢复):
# 重命名系统默认的 logrotate 定时任务脚本(使其不被 cron.daily 执行)
mv /etc/cron.daily/logrotate /etc/cron.daily/logrotate.bak
然后配置自定义定时任务:
0 * * * * /usr/sbin/logrotate /etc/logrotate.conf #只是示例,具体自定义
若需要回退,修改回去即可
2,cat /etc/anacrontab查看默认执行时间:

简单说:是在 3:00~22:00 这个区间内,通过 “基础延迟 + 随机延迟” 实现 “随机时间执行”(避免所有任务集中在凌晨 3 点瞬间触发)。