三服务器日志自动清理脚本

2026年3月13日 boss

三服务器日志自动清理脚本:构建智能日志管理体系

在生产环境中,日志文件会不断增长,消耗大量磁盘空间。本文介绍一套完整的三服务器日志自动清理方案,确保系统稳定运行。

一、引言:日志管理的重要性

痛点场景

问题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周:监控和优化

关于作者

boss

发表评论