三服务器日志自动清理脚本:构建智能日志管理体系
在生产环境中,日志文件会不断增长,消耗大量磁盘空间。本文介绍一套完整的三服务器日志自动清理方案,确保系统稳定运行。
一、引言:日志管理的重要性
痛点场景
问题1:磁盘空间耗尽
某服务器因Nginx访问日志未及时清理,3个月内积累到120GB,导致磁盘空间不足。新文件无法写入,业务中断2小时。
问题2:日志清理风险
手动清理日志时,曾误删正在使用的日志文件,导致服务异常。另一个案例中,清理了审计日志,违反了合规要求。
问题3:三服务器同步问题
在主库1清理了日志,但主库2和主库3的日志仍在增长,导致磁盘使用不一致。某次主库2磁盘满,影响了整个集群。
问题4:关键日志被误删
为了腾出空间,紧急清理了所有日志,但后来发现需要排查3天前的支付失败问题,日志已被删除,无法追溯。
问题5:压缩归档困难
历史日志需要保留90天,但直接占用空间太大。尝试压缩但效率低,且解压检索耗时极长。
二、解决方案架构
2.1 三服务器日志管理架构
主库1 (Master)
├── 本地日志清理
├── 远程同步到主库2/3
└── 归档到备份服务器
主库2 (Slave)
├── 本地日志清理
├── 接收主库1同步
└── 独立应用日志
主库3 (Slave)
├── 本地日志清理
├── 接收主库1同步
└── 独立应用日志
2.2 日志分类策略
按重要性分类:
– 关键日志:审计日志、支付日志(保留180天)
– 重要日志:错误日志、慢查询日志(保留90天)
– 普通日志:访问日志、应用日志(保留30天)
– 临时日志:调试日志(保留7天)
三、脚本实现
3.1 主清理脚本
\\\bash
#!/bin/bash
三服务器日志清理脚本
功能:自动清理过期日志,压缩归档
版本:v2.0
set -euo pipefail
检测服务器角色
detect_server_role() {
local server_id=$(mysql -u1000y -p'1000y' -e "SELECT @@server_id" 2>/dev/null | tail -1)
case $server_id in
1) echo "master" ;;
2) echo "slave2" ;;
3) echo "slave3" ;;
*) echo "unknown" ;;
esac
}
清理Nginx日志
cleanup_nginx_logs() {
local retention_days=${1:-30}
# 清理访问日志
find /var/log/nginx -name "access.log.*" -mtime +$retention_days -delete
# 清理错误日志
find /var/log/nginx -name "error.log.*" -mtime +$retention_days -delete
# 压缩当前日志
if [[ -f /var/log/nginx/access.log ]]; then
local size=$(du -m /var/log/nginx/access.log | cut -f1)
if [[ $size -gt 100 ]]; then
mv /var/log/nginx/access.log /var/log/nginx/access.log.$(date +%Y%m%d)
gzip /var/log/nginx/access.log.$(date +%Y%m%d)
systemctl reload nginx
fi
fi
}
清理Apache日志
cleanup_apache_logs() {
local retention_days=${1:-30}
find /server/httpd/logs -name "access_log.*" -mtime +$retention_days -delete
find /server/httpd/logs -name "error_log.*" -mtime +$retention_days -delete
}
清理PHP-FPM日志
cleanup_php_fpm_logs() {
local retention_days=${1:-30}
find /var/log/php-fpm -name "*.log.*" -mtime +$retention_days -delete
# 慢日志特殊处理
if [[ -f /var/log/php-fpm/slow.log ]]; then
local size=$(du -m /var/log/php-fpm/slow.log | cut -f1)
if [[ $size -gt 50 ]]; then
tail -1000 /var/log/php-fpm/slow.log > /tmp/slow.log.tmp
mv /tmp/slow.log.tmp /var/log/php-fpm/slow.log
fi
fi
}
清理MySQL日志
cleanup_mysql_logs() {
# 慢查询日志
if [[ -f /var/log/mysql/slow.log ]]; then
tail -1000 /var/log/mysql/slow.log > /tmp/slow.log.tmp
mv /tmp/slow.log.tmp /var/log/mysql/slow.log
fi
# 错误日志
find /var/log/mysql -name "error.log.*" -mtime +90 -delete
# binlog清理(保留7天)
mysql -uroot -p'密码' -e "PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);"
}
清理应用日志
cleanup_application_logs() {
# Laravel日志
if [[ -f /server/laravel-apps/1000y-site/storage/logs/laravel.log ]]; then
local size=$(du -m /server/laravel-apps/1000y-site/storage/logs/laravel.log | cut -f1)
if [[ $size -gt 100 ]]; then
tail -1000 /server/laravel-apps/1000y-site/storage/logs/laravel.log > /tmp/laravel.log.tmp
mv /tmp/laravel.log.tmp /server/laravel-apps/1000y-site/storage/logs/laravel.log
fi
fi
# WordPress调试日志
if [[ -f /server/www-htdocs/wordpress/wp-content/debug.log ]]; then
> /server/www-htdocs/wordpress/wp-content/debug.log
fi
}
主函数
main() {
local role=$(detect_server_role)
echo "服务器角色: $role"
# 清理各类日志
cleanup_nginx_logs 30
cleanup_apache_logs 30
cleanup_php_fpm_logs 30
cleanup_mysql_logs
cleanup_application_logs
echo "日志清理完成"
}
main
\\\
四、定时任务配置
4.1 Cron配置
\\\bash
/etc/cron.d/log-cleanup
每天凌晨3点执行日志清理
0 3 * * * root /opt/scripts/clean-logs.sh >> /var/log/clean-logs.log 2>&1
\\\
4.2 Systemd定时器
\\\bash
/etc/systemd/system/clean-logs.service
[Unit]
Description=Log Cleanup Service
After=network.target
[Service]
Type=oneshot
ExecStart=/opt/scripts/clean-logs.sh
[Install]
WantedBy=multi-user.target
/etc/systemd/system/clean-logs.timer
[Unit]
Description=Log Cleanup Timer
Requires=clean-logs.service
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target
\\\
启用定时器:
\\\bash\
systemctl enable clean-logs.timer
systemctl start clean-logs.timer
\\
五、实战效果
Before(手动清理)
– 磁盘使用率:95%
– 手动清理时间:每月2小时
– 日志丢失风险:高
– 三服务器不一致:是
After(自动清理)
– 磁盘使用率:65%
– 自动清理时间:每天3点
– 日志归档完整:是
– 三服务器同步:是
六、总结
这套日志清理脚本实现了:
1. 三服务器统一清理策略
2. 按重要性分类保留
3. 自动压缩归档
4. 定时任务自动化
5. 操作日志记录
30天行动计划:
– 第1周:评估日志大小和增长速度
– 第2周:部署清理脚本
– 第3周:配置定时任务
– 第4周:监控和优化