好的阿杰,我们来系统讲解一下 Linux 自带的日志管理神器 logrotate
,帮你理解原理、使用方法和高级技巧。
1️⃣ 什么是 logrotate
logrotate
是 Linux 系统自带的 日志轮转工具,用于:
- 自动按大小或时间切割日志
- 自动压缩旧日志(节省磁盘空间)
- 删除过期日志
- 配合 cron 定时执行,实现 自动化日志管理
为什么需要它:
日志文件如果无限增长,会占满磁盘,导致系统崩溃。logrotate
就像“日志保姆”,帮你管理日志生命周期。
2️⃣ logrotate 的配置结构
logrotate 的配置文件主要有两个:
- 全局配置文件
/etc/logrotate.conf
- 单独应用配置文件(通常在
/etc/logrotate.d/
目录下)
/etc/logrotate.d/nginx
/etc/logrotate.d/mysql
全局配置示例:
# 每天轮转日志
daily
# 保留最近 7 个轮转文件
rotate 7
# 压缩旧日志
compress
# 日志轮转时以 root 身份运行
create 0640 root adm
# include 指定单独应用日志配置
include /etc/logrotate.d
3️⃣ 单独日志配置示例
以 Nginx 日志为例:
/var/log/nginx/*.log {
daily # 每天轮转
rotate 14 # 保留 14 个轮转文件
missingok # 日志文件不存在也不报错
notifempty # 日志为空时不轮转
compress # 轮转后压缩日志
delaycompress # 延迟压缩,上一个日志文件先保留未压缩
sharedscripts # 多个日志共享同一个脚本
postrotate
systemctl reload nginx > /dev/null 2>/dev/null
endscript
}
配置解析:
配置项 | 作用 |
---|---|
daily/weekly/monthly | 日志轮转周期 |
rotate N | 保留最近 N 个轮转日志 |
compress | 压缩旧日志(gzip) |
delaycompress | 保留最近一个旧日志不压缩(方便分析) |
missingok | 日志不存在也不报错 |
notifempty | 日志为空不轮转 |
postrotate/endscript | 轮转后执行命令,如重新加载服务 |
4️⃣ 常用 logrotate 命令
- 测试配置(不实际轮转,查看效果):
logrotate -d /etc/logrotate.conf
- 手动轮转:
logrotate -f /etc/logrotate.conf
- 查看 logrotate 版本:
logrotate -v
5️⃣ 高级技巧
- 按大小轮转日志
/var/log/myapp.log {
size 100M # 日志文件达到100MB就轮转
rotate 10
compress
}
- 结合 cron 定时执行
- 通常系统自带:
/etc/cron.daily/logrotate
- 也可以自定义:
*/30 * * * * /usr/sbin/logrotate -f /etc/logrotate.conf
- 多日志共享 postrotate 脚本
sharedscripts
postrotate
systemctl reload nginx
systemctl reload php-fpm
endscript
- 邮件通知
mail admin@example.com
mailfirst
- 轮转日志时,邮件发送通知。
6️⃣ logrotate 工作原理
- 读取配置文件,确定轮转策略
- 检查日志文件是否符合轮转条件(周期/大小)
- 重命名日志文件:
access.log
→access.log.1
- 压缩旧日志
access.log.2.gz
- 新建空日志文件,保证服务写日志不出错
- 执行 postrotate 脚本,如重载服务
原理图示(文字版):
access.log
│
▼
access.log.1 ← 压缩 → access.log.2.gz
│
▼
新建空日志 access.log
│
▼
执行 postrotate 脚本
7️⃣ 注意事项
- 服务必须支持日志重开(reload / reopen)
- 轮转频率:频繁轮转会增加磁盘 I/O
- 保留策略:日志量大时,合理设置 rotate 数量,避免磁盘满
发表回复