日志不轮转,迟早把磁盘写满。logrotate 是 Linux 自带的日志管理工具,配合 cron 自动执行。
配置文件位置
/etc/logrotate.conf:全局配置/etc/logrotate.d/:各服务单独配置,推荐放这里
一个典型配置
/var/log/myapp/*.log {
daily
rotate 14
missingok
notifempty
compress
delaycompress
copytruncate
dateext
dateformat -%Y%m%d
create 0640 www-data www-data
}
逐项说明:
daily:每天轮转,也可用size 100M按大小rotate 14:保留 14 份missingok:文件不存在不报错notifempty:空文件不轮转compress:压缩旧日志delaycompress:延迟一次压缩,方便最近一份还能直接看copytruncate:复制后清空原文件,适合不支持重开日志的进程dateext:用日期做后缀,比数字后缀直观
测试
# 调试模式,不实际执行
logrotate -d /etc/logrotate.d/myapp
# 强制立即轮转一次
logrotate -f /etc/logrotate.d/myapp
copytruncate 还是 create
- 程序支持收到信号后重开日志(如 Nginx):用
create+postrotate发信号,更安全 - 程序不支持(如某些 Java 应用):用
copytruncate,但有极短时间可能丢日志
cron 执行
logrotate 一般由 /etc/cron.daily/logrotate 每天触发,不需要自己写 cron。如果是自定义时间,可以加一条:
0 3 * * * /usr/sbin/logrotate /etc/logrotate.d/myapp
配好之后,磁盘再也没因为日志满过。

Comments 3 条评论
copytruncate 和 create 的区别讲清了
delaycompress 我一直没用过
notifempty 不写会轮转一堆空文件