logrotate是Linux系统自带的日志轮转工具,需在/etc/logrotate.d/下为各服务配置独立规则,结合daily或size触发、rotate保留份数、compress压缩、postrotate通知服务重载日志,再用-d和-f验证生效。

新手配置Linux日志轮转,关键不是“等日志爆了再处理”,而是提前给系统服务日志(如syslog、nginx、mysql等)配上自动切割+压缩+清理的规则。logrotate是系统自带工具,不用装,但必须配对、配准、配活——否则它就只是个摆设。
确认logrotate已就位并被定时调用
它默认存在,但未必在跑你的规则:
- 运行logrotate --version,有输出即已安装
- 执行sudo systemctl list-timers | grep logrotate,看到类似
logrotate.timer且状态为active,说明每天会自动触发一次 - 若没看到,检查/etc/cron.daily/logrotate是否存在,或手动加一句
0 0 * * * /usr/sbin/logrotate /etc/logrotate.conf到crontab -e
为系统服务单独写配置(推荐放/etc/logrotate.d/)
不要改全局文件,直接在/etc/logrotate.d/下建对应服务的配置,优先级高、易维护:
- 比如查rsyslog日志路径:cat /etc/logrotate.d/rsyslog,通常为
/var/log/syslog和/var/log/mail.log等 - 新建一个配置:sudo nano /etc/logrotate.d/myapp(把
myapp换成你的服务名) - 填入最小可用配置(以
/var/log/myapp/app.log为例):
/var/log/myapp/app.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0644 root root
}解释:每天切一次;不存在也不报错;保留14份;压缩旧日志;空文件不切;新日志权限644,属主root
按大小轮转更防突发膨胀
时间周期(daily/weekly)靠不住——有些服务几小时就能打满1GB。用size参数才是硬保障:
- 把上面配置里的
daily换成size 100M,表示只要日志超过100MB立刻轮转 - 注意:
size优先级高于daily,二者共存时满足任一即触发 - 若想更激进,可写
size +50M:指“比上次轮转后新增50MB就切”(适合高频小日志场景)
轮转后必须让服务重开日志文件
logrotate切完日志,旧进程还在往原文件句柄里写——新文件是空的,旧文件还在涨。必须发信号让它“reopen”:
- 在配置块里加
postrotate段,例如:
postrotate
if systemctl is-active --quiet rsyslog; then
kill -USR1 $(cat /var/run/rsyslogd.pid 2>/dev/null)
fi
endscript常见服务信号参考:
- rsyslog:USR1
-
nginx:
nginx -s reopen - apache2:USR1
- 自研Java服务:需暴露HTTP接口或JMX,用curl触发
不加这一步,轮转等于白做。
立即验证配置是否生效
别等明天cron跑,现在就测:
- 语法检查:sudo logrotate -d /etc/logrotate.d/myapp(-d只模拟,看有没有“rotating log”字样)
- 强制执行:sudo logrotate -f /etc/logrotate.d/myapp(-f真实切割,观察
ls -lh /var/log/myapp/是否出现app.log.1) - 查状态记录:cat /var/lib/logrotate/status | grep myapp,确认时间已更新
配完记得盯两天df -h /var,看磁盘增长是否明显放缓。


















