必须立即启用logrotate实现日志按天切割+压缩+自动清理:Nginx用daily+sharedscripts+delaycompress+USR1重载,MySQL错误日志用size=100M+copytruncate避免中断。

Linux服务器上Nginx、MySQL或自定义应用日志持续写入,几天后单个access.log就涨到8GB,用vim打不开、grep卡死、磁盘使用率飙升到95%,必须立即启用logrotate按天切割+压缩+自动清理旧文件,否则下次故障排查将无从下手。
确认logrotate已就位并理解执行机制
运行rpm -qa | grep logrotate(CentOS/RHEL)或dpkg -l | grep logrotate(Debian/Ubuntu),有输出即已预装。若无,用yum install -y logrotate或apt install -y logrotate安装。
系统默认每天凌晨通过/etc/cron.daily/logrotate触发一次轮转,它会依次加载/etc/logrotate.conf全局配置和/etc/logrotate.d/下所有独立规则文件——你只需往/etc/logrotate.d/里放新配置,无需动主配置。
为Nginx日志创建专用轮转规则
执行sudo vim /etc/logrotate.d/nginx,写入以下内容:
/var/log/nginx/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 640 nginx nginx
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 $(cat /var/run/nginx.pid)
fi
endscript
}
其中sharedscripts确保多个日志文件(如access.log、error.log)轮转完成后只发一次USR1信号;delaycompress让当天轮转出的access.log.1暂不压缩,等明天轮转出access.log.2时再把.1压成.1.gz,避免Nginx重载时读取被压缩的旧文件出错。
对MySQL错误日志启用大小驱动轮转
MySQL error.log不支持USR1重载,且写入频率低,更适合按大小切割。执行sudo vim /etc/logrotate.d/mysql:
/var/log/mysql/error.log {
size=100M
missingok
rotate 7
nocompress
create 640 mysql mysql
copytruncate
}
【copytruncate是关键】因为mysqld进程始终持有error.log句柄且不响应信号,直接mv会导致日志丢失;copytruncate先复制当前内容到error.log.1,再清空原文件,保证写入不中断——但注意:复制与清空之间存在毫秒级间隙,极小概率丢1~2行日志。
手动验证配置是否生效
第一步:运行sudo logrotate -d /etc/logrotate.d/nginx查看调试输出,确认路径、参数解析无误。注意:-d模式只打印日志不实际执行。
第二步:加-v参数强制执行一次:sudo logrotate -v /etc/logrotate.d/nginx。成功后检查/var/log/nginx/目录,应出现access.log.1(未压缩)和access.log(新空文件)。
第三步:等待次日0点或手动触发系统级轮转:sudo /etc/cron.daily/logrotate,观察access.log.1是否变为access.log.1.gz,同时access.log.2生成。


















