Administrator
发布于 2025-09-01 / 9 阅读
0
0

linux原生的日志切割/归档工具--logrotate

概述:

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 点瞬间触发)。


评论