最稳妥做法是用 truncate 清空日志内容或配置 logrotate 自动轮转:sudo truncate -s 0 /var/log/apache2/access.log;编辑 /etc/logrotate.d/apache2 设置 daily、rotate 30、compress 等规则,并在 postrotate 中 reload apache,既释放空间又不中断服务、不丢失句柄。

Apache 的 logs 目录日志满了,最稳妥的做法不是直接删文件,而是清空内容或轮转归档——既释放磁盘空间,又不中断服务、不丢失当前日志句柄。
直接清空日志文件(推荐临时应急)
Apache 进程通常以追加方式写入 access.log 和 error.log,只要文件没被删除,进程仍能继续写。用 truncate 清空内容最安全:
-
sudo truncate -s 0 /var/log/apache2/access.log -
sudo truncate -s 0 /var/log/apache2/error.log
CentOS/RHEL 系统路径一般是/var/log/httpd/,命令同理。
⚠️ 注意:不要用> access.log或echo "" > access.log,可能因权限或 SELinux 导致写入失败;truncate是原子操作,更可靠。
按时间自动清理旧日志(长期策略)
用 find 配合 cron 定期清理压缩过的旧日志(如 .log.1.gz, .log.2.gz):
# 删除90天前的归档日志(仅匹配带日期或数字后缀的压缩文件) find /var/log/apache2 -type f -name "*.log.*.gz" -mtime +90 -delete
先加 -print 测试,确认匹配无误再加 -delete。
启用 logrotate 实现全自动轮转
编辑 /etc/logrotate.d/apache2(Ubuntu)或 /etc/logrotate.d/httpd(CentOS),确保包含:
-
daily或size 100M(按天或按大小触发) -
rotate 30(保留30份) -
compress(自动 gzip 压缩) -
missingok(忽略缺失文件) -
notifempty(空文件不轮转) -
create 640 root adm(新建日志权限) -
sharedscripts+postrotate ... systemctl reload apache2 ... endscript(重载配置,避免重启)
避免日志爆炸的源头优化
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 关闭静态资源日志:在虚拟主机配置中加
SetEnvIf Request_URI "\.(css|js|png|jpg|gif|ico)$" no-log,再在CustomLog后加env=!no-log - 精简日志格式:用
LogFormat "%h %t \"%r\" %>s %b" common替代combined,去掉 Referer、User-Agent 等冗余字段 - 错误日志级别调高:
LogLevel warn(默认是warn,若设为info或debug会剧增日志量)
特别提醒
- 不要
rm -f *.log—— Apache 可能仍在写入,删除后新日志会写到 inode 已释放的位置,导致磁盘空间不释放(lsof | grep deleted可查) - 若已满且无法
truncate,可先kill -USR1 $(cat /var/run/apache2.pid)(Linux)发送日志 reopen 信号,再清空
本质上,日志满不是“清理问题”,而是“管理缺位”。配好 logrotate + 优化日志粒度,比每次手动救火更省心。










