#!/bin/bash # =================================================================== # Docker 容器日志 & 系统日志清理脚本 # 功能:当容器日志或 /var/log 超过阈值时自动清理 # 使用:./cleanup-logs.sh [容器日志阈值GB] [系统日志阈值GB] # 示例:./cleanup-logs.sh 2 2 # =================================================================== CONTAINER_THRESHOLD=${1:-2} # 默认容器日志超过 2GB 才清理 SYSLOG_THRESHOLD=${2:-2} # 默认系统日志超过 2GB 才清理 echo "==========================================" echo "日志清理脚本" echo "容器日志阈值: ${CONTAINER_THRESHOLD}GB" echo "系统日志阈值: ${SYSLOG_THRESHOLD}GB" echo "==========================================" # ========== 1. 清理 Docker 容器日志 ========== echo "" echo "=== 检查容器日志 ===" total_container_log=0 cleared_containers=0 for container in $(docker ps -q); do log_file=$(docker inspect --format='{{.LogPath}}' "$container" 2>/dev/null) container_name=$(docker inspect --format='{{.Name}}' "$container" 2>/dev/null | sed 's/^\///') if [ -f "$log_file" ]; then size_bytes=$(stat -c%s "$log_file" 2>/dev/null || echo 0) size_gb=$((size_bytes / 1024 / 1024 / 1024)) total_container_log=$((total_container_log + size_bytes)) if [ $size_gb -ge $CONTAINER_THRESHOLD ]; then truncate -s 0 "$log_file" 2>/dev/null echo " ✅ 已清理: $container_name (${size_gb}GB)" cleared_containers=$((cleared_containers + 1)) fi fi done total_container_gb=$((total_container_log / 1024 / 1024 / 1024)) echo "容器日志总大小: ${total_container_gb}GB" echo "已清理容器数: $cleared_containers" # ========== 2. 清理 /var/log 日志 ========== echo "" echo "=== 检查系统日志 ===" total_syslog_size=0 cleared_logs=0 # 找出 /var/log 下超过阈值的大文件并清理 for logfile in $(find /var/log -type f -name "*.log" 2>/dev/null); do if [ -f "$logfile" ]; then size_bytes=$(stat -c%s "$logfile" 2>/dev/null || echo 0) size_gb=$((size_bytes / 1024 / 1024 / 1024)) total_syslog_size=$((total_syslog_size + size_bytes)) if [ $size_gb -ge $SYSLOG_THRESHOLD ]; then truncate -s 0 "$logfile" 2>/dev/null echo " ✅ 已清理: $logfile (${size_gb}GB)" cleared_logs=$((cleared_logs + 1)) fi fi done # 也清理旧的压缩日志 for gzfile in $(find /var/log -type f -name "*.gz" 2>/dev/null | head -20); do if [ -f "$gzfile" ]; then rm -f "$gzfile" 2>/dev/null && echo " ✅ 已删: $gzfile" fi done # 清理旧的 log.1, log.2 等轮转文件 for oldlog in $(find /var/log -type f -name "*.log.[0-9]*" 2>/dev/null); do rm -f "$oldlog" 2>/dev/null && echo " ✅ 已删: $oldlog" done total_syslog_gb=$((total_syslog_size / 1024 / 1024 / 1024)) echo "系统日志总大小: ${total_syslog_gb}GB" echo "已清理日志数: $cleared_logs" # ========== 3. 磁盘状态 ========== echo "" echo "=== 当前磁盘状态 ===" df -h / echo "" echo "==========================================" echo "清理完成" echo "=========================================="