日志分析不负责轮转,防止磁盘占满靠logrotate配置:需确认启用并定时运行,为各服务在/etc/logrotate.d/下单独配规则,含size、rotate、compress等,并用postrotate reload服务或kill -USR1,最后用-d和-f验证生效。

日志分析本身不负责轮转,真正防止磁盘占满的是日志轮转配置。关键不是等日志大了再查,而是让日志在写入过程中就被自动切分、压缩、清理——logrotate 就是干这个的,系统自带,不用装,但得配对、配准、配活。
确认 logrotate 已启用并按时运行
它默认存在,但未必真在干活:
- 运行 logrotate --version,有输出说明已安装
- 执行 sudo systemctl list-timers | grep logrotate,看到 active 状态的 logrotate.timer,代表每天会自动触发
- 如果没看到,检查 /etc/cron.daily/logrotate 是否存在;没有就手动加定时任务:0 0 * * * /usr/sbin/logrotate /etc/logrotate.conf
为每个服务单独建轮转配置
别改全局文件 /etc/logrotate.conf,直接在 /etc/logrotate.d/ 下新建对应服务的配置(比如 nginx、mysql、x-ui),优先级高、好维护、不串扰:
- 先确认服务日志路径,例如查 nginx:systemctl status nginx 或看其配置里的 error_log/access_log
- 用 sudo nano /etc/logrotate.d/nginx 创建配置
- 填入基础规则(以 /var/log/nginx/access.log 为例):
size 100M
rotate 7
compress
delaycompress
missingok
notifempty
create 0644 www-data www-data
postrotate
systemctl reload nginx > /dev/null 2>&1 || true
endscript
}
必须让服务重开日志文件句柄
logrotate 切完日志,老进程还在往旧文件句柄里写,新文件是空的,旧文件照涨不误。所以一定要通过 postrotate 发信号或 reload:
- 对 systemd 服务,用 systemctl reload 服务名(推荐,平滑)或 systemctl restart(强制)
- 对不支持 reload 的程序,可用 kill -USR1 $(cat /var/run/xxx.pid)(需确认进程支持)
- 实在不行加 copytruncate:先复制再清空原文件,避免中断写入(适合无法 reload 的场景)
验证配置是否生效
别等磁盘满了才发现没起作用:
- 语法检查:sudo logrotate -d /etc/logrotate.d/nginx(-d 是 debug 模式,只模拟不执行)
- 立即执行一次:sudo logrotate -f /etc/logrotate.d/nginx,然后看 /var/log/nginx/ 下是否生成 .1.gz 文件、新日志是否继续写入
- 观察几天,用 du -sh /var/log/nginx/*.log* 确认大小是否受控


















