Linux日志切割logrotate配置详解
时间:2026-11-15 07:39 作者:emer 分类: 无
服务器跑久了,Nginx、MySQL、PHP 的日志会越滚越大,把磁盘吃到 100%。手动删日志不现实,而且服务还在往旧文件里写。logrotate 是 Linux 自带的日志切割工具,按天或按大小自动归档、压缩、删旧,并通知服务重新打开日志句柄。本文讲清配置位置、关键字段和常见坑。
一、logrotate 工作机制
logrotate 由系统定时任务驱动,通常在 /etc/cron.daily/logrotate 里每天跑一次。它读取 /etc/logrotate.conf 和 /etc/logrotate.d/ 下的配置,对符合条件的日志执行切割、压缩、保留策略。
# 查看默认主配置
cat /etc/logrotate.conf
# 查看各软件独立配置
ls /etc/logrotate.d/
二、一个完整 Nginx 日志配置示例
在 /etc/logrotate.d/nginx 写入:
/var/log/nginx/*.log {
daily # 按天切割
missingok # 日志不存在不报错
rotate 14 # 保留 14 份历史
compress # 旧日志 gzip 压缩
delaycompress # 延迟一次再压缩,避免抢写
notifempty # 空文件不切割
create 0640 nginx adm # 新建日志的权限和属主
sharedscripts # 多个日志只执行一次脚本
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
三、常用关键字段说明
daily:按天切割,也可换weekly、monthly。size 100M:超过大小就切割,和时间条件可共存。rotate 14:保留份数,超出自动删除最旧的。compress/nocompress:是否压缩历史日志。notifempty:文件为空则跳过,防止产生一堆空归档。dateext:归档名带日期,如 access.log-20261115.gz。postrotate ... endscript:切割后执行的命令,最常见是给服务发信号重开日志。
四、手动测试配置
改完配置别等明天,先强制跑一遍验证:
# 只检查语法,不真正执行
logrotate -d /etc/logrotate.d/nginx
# 强制执行一次切割
logrotate -f /etc/logrotate.d/nginx
-d 是调试模式,会打印它打算怎么处理但不落盘,排错首选。
五、常见坑
- 切割后服务仍往旧文件写:必须在 postrotate 里给 Nginx 发 USR1 信号或 reload,让它重新打开日志文件,否则新日志写进归档。
- 压缩和写入冲突:同一次切割立刻压缩正在被写的文件会报错,用
delaycompress延后一轮。 - 路径用通配符 /var/log/nginx/*.log 时,别把已经切割压缩的归档再匹配进去。
rotate份数设太小,误删还想查的历史;设太大又占磁盘,按业务保留周期定。- 自定义配置文件放错目录:必须在 /etc/logrotate.d/ 下,主配置里要 include 该目录。
- 容器内日志不走 logrotate,要用 Docker 日志驱动或应用自身轮转。
- 改完没 reload,系统 cron 第二天才生效,紧急时手动
-f执行。
总结
logrotate 靠「时间或大小触发 + 保留份数 + 压缩 + postrotate 通知服务」解决日志膨胀。配置写在 /etc/logrotate.d/,改完先用 -d 调试、再用 -f 强制执行验证,关键别漏掉切割后让服务重开日志的信号。
遇到问题加QQ23979811 协助处理