在 Debian 上,Apache 日志分割最常用、最推荐的做法是使用 logrotate,而不是自己写脚本。下面按“推荐方案 → 其他方案 → 常见排查”来说明。
Debian 安装 Apache 后,已经自带 logrotate 配置,通常位于:
/etc/logrotate.d/apache2
cat /etc/logrotate.d/apache2
典型内容示例(简化):
/var/log/apache2/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 640 www-data adm
sharedscripts
postrotate
systemctl reload apache2 > /dev/null 2>&1 || true
endscript
}
| 参数 | 含义 |
|---|---|
daily |
每天分割 |
weekly |
每周分割 |
rotate 14 |
保留 14 个旧日志 |
compress |
压缩旧日志(.gz) |
delaycompress |
延迟一次压缩 |
notifempty |
空日志不分割 |
postrotate |
分割后让 Apache 重新打开日志 |
✅ 关键点:
postrotate 里必须 reload Apache,否则 Apache 还会写旧文件。
daily
rotate 30
size 100M
rotate 10
修改后无需重启,logrotate 自动生效。
logrotate -d /etc/logrotate.d/apache2
(-d 是调试模式,不真正执行)
强制执行一次:
logrotate -f /etc/logrotate.d/apache2
Apache 自带 rotatelogs,但配置复杂、容易踩坑。
CustomLog "|/usr/bin/rotatelogs /var/log/apache2/access.log.%Y-%m-%d 86400" combined
ErrorLog "|/usr/bin/rotatelogs /var/log/apache2/error.log.%Y-%m-%d 86400"
⚠️ 缺点:
如果你的日志不在默认位置,例如:
CustomLog /var/log/apache2/site1/access.log combined
在 /etc/logrotate.d/apache2 中增加路径:
/var/log/apache2/site1/*.log {
daily
rotate 30
compress
missingok
notifempty
create 640 www-data adm
postrotate
systemctl reload apache2
endscript
}
确认 logrotate 已运行:
cat /var/lib/logrotate/status
确认 cron 正常:
systemctl status cron
查看日志:
cat /var/log/syslog | grep logrotate
一定是 没有 reload Apache
✅ 必须包含:
systemctl reload apache2
✅ Debian + Apache 官方推荐方案
logrotaterotatelogspostrotate reload apache2如果你愿意,可以把你的:
发给我,我可以直接帮你写一份 可用的 logrotate 配置。