一、为什么需要清理Apache日志?
Apache日志是服务器运维的重要部分,但随着时间推移,日志文件会快速膨胀,占用大量磁盘空间。了解如何清理和优化日志,对服务器管理员至关重要。
日志膨胀的常见原因:
– 高流量网站每天产生数GB日志
– Debug模式记录大量详细信息
– 错误日志持续增长
– 缺乏轮转机制
二、Apache日志类型与位置
2.1 主要日志文件
| 日志类型 | Ubuntu路径 | CentOS路径 | 作用 |
|---|---|---|---|
| 错误日志 | /var/log/apache2/error.log | /var/log/httpd/error_log | 记录错误信息 |
| 访问日志 | /var/log/apache2/access.log | /var/log/httpd/access_log | 记录访问请求 |
| SSL错误 | /var/log/apache2/ssl_error.log | /var/log/httpd/ssl_error_log | SSL问题 |
2.2 查看日志大小
# 查看Apache日志目录大小
du -sh /var/log/apache2/
# 查看单个日志文件大小
ls -lh /var/log/apache2/*.log
# 查找大于100MB的日志文件
find /var/log/apache2/ -type f -size +100M
三、手动清理日志
3.1 清理错误日志
# 方法1:直接清空文件(保留文件)
sudo tee /var/log/apache2/error.log </dev/null
# 方法2:删除并重建
sudo rm /var/log/apache2/error.log
sudo touch /var/log/apache2/error.log
sudo chmod 640 /var/log/apache2/error.log
sudo chown root:adm /var/log/apache2/error.log
3.2 清理访问日志
# 清空访问日志
sudo tee /var/log/apache2/access.log </dev/null
# 同时清理SSL日志
sudo tee /var/log/apache2/ssl_error.log </dev/null
3.3 清理所有Apache日志
# 一键清理所有Apache日志
sudo for log in /var/log/apache2/*.log; do
sudo tee "$log" </dev/null
done
# 或删除所有日志文件
sudo rm /var/log/apache2/*.log
sudo systemctl restart apache2
四、配置日志自动轮转
4.1 使用logrotate
logrotate是Linux标准的日志轮转工具,自动管理日志文件大小。
创建配置文件:
sudo nano /etc/logrotate.d/apache2
添加以下内容:
/var/log/apache2/*.log {
daily # 每天轮转
missingok # 忽略缺失文件
rotate 14 # 保留14个历史文件
compress # 压缩旧日志
delaycompress # 延迟压缩
notifempty # 不轮转空文件
create 640 root adm # 新文件权限
sharedscripts # 脚本只执行一次
postrotate
if [ -f /var/run/apache2/apache2.pid ]; then
/etc/init.d/apache2 reload > /dev/null || true
fi
endscript
}
4.2 测试logrotate配置
# 测试配置
sudo logrotate -d /etc/logrotate.d/apache2
# 强制轮转(测试用)
sudo logrotate -f /etc/logrotate.d/apache2
4.3 手动触发轮转
# 手动轮转所有日志
sudo logrotate -f /etc/logrotate.d/apache2
# 查看轮转后的文件
ls -la /var/log/apache2/
五、按日期清理日志
5.1 清理特定天数的日志
# 删除7天前的日志
sudo find /var/log/apache2/ -type f -name "*.log.*" -mtime +7 -delete
# 删除30天前的压缩日志
sudo find /var/log/apache2/ -type f -name "*.log.*.gz" -mtime +30 -delete
5.2 定期清理脚本
创建清理脚本:
#!/bin/bash
# /opt/scripts/clean_apache_logs.sh
DATE=$(date +%Y%m%d)
LOG_DIR="/var/log/apache2"
MAX_DAYS=30
echo "[$(date)] 开始清理Apache日志..."
# 清理超过30天的日志文件
find $LOG_DIR -type f -name "*.log.*" -mtime +$MAX_DAYS -delete
# 清理空文件
find $LOG_DIR -type f -size 0 -delete
# 记录清理日志
echo "[$(date)] 日志清理完成" >> /var/log/apache2_cleanup.log
# 查看磁盘空间变化
df -h $LOG_DIR
添加执行权限并配置定时任务:
sudo chmod +x /opt/scripts/clean_apache_logs.sh
# 配置每天凌晨3点执行
sudo crontab -e
0 3 * * * /opt/scripts/clean_apache_logs.sh >> /dev/null 2>&1
六、限制日志大小
6.1 配置错误日志大小限制
在Apache配置中添加:
# 限制错误日志最大50MB
ErrorLog "|rotatelogs /var/log/apache2/error.log 50M"
# 或使用条件日志
<IfModule log_config_module>
BufferedLogs On
缓冲记录提高性能
</IfModule>
6.2 限制访问日志记录
# 仅记录重要信息
LogFormat "%h %l %u %t \"%r\" %>s %b" common
# 压缩后记录(节省空间)
CustomLog "|gzip > /var/log/apache2/access.log.gz" combined
七、监控磁盘空间
7.1 设置磁盘空间告警
#!/bin/bash
# /opt/scripts/check_disk_space.sh
THRESHOLD=80
USAGE=$(df -h /var/log | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $USAGE -gt $THRESHOLD ]; then
echo "警告:Apache日志目录磁盘使用率${USAGE}%,超过${THRESHOLD}%"
# 发送告警(可选)
# echo "磁盘告警" | mail -s "Apache日志空间警告" admin@example.com
fi
7.2 定时监控
# 每小时检查磁盘空间
sudo crontab -e
0 * * * * /opt/scripts/check_disk_space.sh
八、总结
Apache日志清理和磁盘空间优化是服务器运维的重要环节:
- 定期手动清理:使用tee命令清空或find删除
- 配置logrotate:自动轮转,无需手动干预
- 设置定时任务:定期清理历史日志
- 限制日志大小:配置缓冲和压缩
- 监控告警:及时发现空间问题
掌握这些方法,可以有效管理Apache日志空间,避免磁盘满导致的服务故障。
本文基于Ubuntu 22.04 + Apache 2.4环境编写,适用于大多数Linux服务器场景。