logrotate可自动轮转、压缩、清理日志;需确认启用定时任务,为服务单独配置规则,支持按时间或大小触发,配合postrotate通知服务重开句柄。

直接配好 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 到 crontab -e
为服务单独建配置(推荐放 /etc/logrotate.d/)
别改全局文件,每个服务配一个独立规则,清晰又安全:
- 新建配置:例如你的应用日志在 /var/log/myapp/app.log,运行
sudo nano /etc/logrotate.d/myapp - 填入基础配置(按需调整路径和参数):
/var/log/myapp/app.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0644 root root
} - 关键参数含义:
– daily:每天检查是否轮转(也可换为 weekly 或 size 100M)
– rotate 14:最多留 14 份归档(含压缩后)
– compress + delaycompress:旧日志打 .gz,但最新一份先不压,下次轮转时再压
– create 0644 root root:轮转后新建空日志,权限 644,属主属组都是 root
按大小轮转更防突发写满
光靠 daily 不保险——有些服务几分钟就写几百 MB。用 size 才真正兜底:
- 把配置里的 daily 换成 size 100M,表示日志一超 100MB 立刻切
- 支持增量判断:size +50M 表示“比上一次轮转后新增 50MB 就切”,适合高频小日志场景
- 注意:size 和 daily 可共存,满足任一即触发
轮转后必须通知服务重开日志句柄
否则进程还在往旧文件句柄写,新日志永远为空:
- 在配置块里加 postrotate / endscript 段,例如:
postrotate
if systemctl is-active --quiet myapp; then
systemctl kill --signal=USR1 myapp
fi
endscript - 常见服务信号参考:
– nginx:用 nginx -s reopen 或 systemctl reload nginx
– rsyslog:发 USR1 或调 /usr/lib/rsyslog/rsyslog-rotate
– 自研服务:确认是否支持 USR1、HUP 或提供 reload 接口 - 务必用绝对路径写命令,所有脚本以 endscript 结尾
配完记得用 sudo logrotate -d /etc/logrotate.d/myapp 看调试输出,再用 -f 强制跑一次验证效果。不复杂但容易忽略。











