Apache日志切割核心是可控轮转与自动清理,禁用直接删除正在写入的日志文件;推荐logrotate(每日轮转、保留7份、重载服务)或rotatelogs(按时间/大小实时分割);需精简日志内容并设定分级保留策略。

Apache 日志切割的核心目标是防止单个日志文件持续增长、占满磁盘,同时保留可追溯的访问与错误记录。关键不在于“切”,而在于“可控轮转+自动清理”。直接删正在写的日志文件(如 rm access_log)会锁住文件句柄,空间不释放,服务还可能异常——这是最常踩的坑。
用 logrotate 实现自动化轮转与清理
Linux 系统自带、稳定可靠,无需额外安装,适合生产环境长期运行。
- 配置文件放在
/etc/logrotate.d/apache2(Debian/Ubuntu)或/etc/logrotate.d/httpd(CentOS/RHEL) - 典型配置示例:
/var/log/apache2/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0644 root adm
sharedscripts
postrotate
if [ -f /var/run/apache2.pid ]; then
systemctl reload apache2 > /dev/null 2>&1 || true
fi
endscript
}
说明:每天切割一次,保留最近 7 份(含压缩),空文件不处理,切割后重载 Apache 保证新日志写入。注意 sharedscripts 和 postrotate 配合使用,避免多次触发重载。
用 rotatelogs 按时间或大小实时分割
Apache 自带工具,路径通常为 /usr/bin/rotatelogs 或 /usr/sbin/rotatelogs,无需依赖外部服务,适合对日志时效性要求高的场景。
- 按天分割(推荐):
ErrorLog "|/usr/bin/rotatelogs -l /var/log/apache2/error_%Y%m%d.log 86400" CustomLog "|/usr/bin/rotatelogs -l /var/log/apache2/access_%Y%m%d.log 86400" combined
- 按大小分割(例如每 100MB 切一个):
CustomLog "|/usr/bin/rotatelogs /var/log/apache2/access_%Y%m%d_%H%M%S.log 100M" combined
-l 参数确保使用本地时区(避免默认 UTC 时间偏差);时间戳格式支持 %Y%m%d、%H%M%S 等,便于归档识别。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
精简日志内容,从源头减负
再好的轮转也治标不治本。如果日志里塞满静态资源(js/css/png)、健康检查探针、重复调试信息,再大的磁盘也会被快速填满。
- 禁用静态资源日志(在虚拟主机或目录配置中):
<FilesMatch "\.(ico|png|gif|jpg|css|js|woff2|svg)$">
CustomLog /dev/null common
</FilesMatch>
- 自定义精简日志格式(只留关键字段):
LogFormat "%h %t \"%r\" %>s %b \"%{Referer}i\"" short
CustomLog /var/log/apache2/access_short.log short
相比默认 combined 格式,省去 User-Agent、Cookie 等大体积字段,日志体积可减少 30%–60%。
设置保留策略并定期验证
轮转不是一劳永逸。必须明确“保留多久”和“谁来清理”。建议遵循「7 天普通日志 + 30 天关键日志」双轨策略:
- 普通网站访问日志:logrotate 中设
rotate 7,配合compress - 核心业务或审计相关日志(如登录、支付回调):单独配置路径 +
rotate 30,并启用mail root异常告警 - 每月人工抽查一次
du -sh /var/log/apache2/*,确认旧日志是否真实删除、压缩是否生效
磁盘空间告警应联动日志策略——比如当 /var 使用率超 85%,自动触发一次强制 logrotate 并发送通知。

















