日志清理脚本怎么写?

wen 实用脚本 61

本文目录导读:

日志清理脚本怎么写?

  1. Linux Shell 脚本(最常用)
  2. 更安全的版本(带确认和备份)
  3. Python 脚本(跨平台)
  4. Windows PowerShell 脚本
  5. crontab 配置(Linux 定时执行)
  6. 使用建议

Linux Shell 脚本(最常用)

#!/bin/bash
# 日志清理脚本
# 功能:删除指定目录下超过N天的日志文件
LOG_DIR="/var/log/myapp"  # 日志目录
DAYS_TO_KEEP=7            # 保留天数
FILE_PATTERN="*.log"      # 文件匹配模式
echo "开始清理日志文件..."
echo "目标目录: $LOG_DIR"
echo "保留天数: $DAYS_TO_KEEP"
# 查找并删除旧日志文件
find $LOG_DIR -name "$FILE_PATTERN" -type f -mtime +$DAYS_TO_KEEP -exec rm -f {} \;
# 或者安全的方式:先打印再删除
# find $LOG_DIR -name "$FILE_PATTERN" -type f -mtime +$DAYS_TO_KEEP -print
echo "清理完成!"
# 可选:记录清理日志
echo "$(date) - 清理了 $(find $LOG_DIR -name "$FILE_PATTERN" -type f -mtime +$DAYS_TO_KEEP | wc -l) 个文件" >> /var/log/cleanup.log

更安全的版本(带确认和备份)

#!/bin/bash
# 安全日志清理脚本
LOG_DIR="/var/log/myapp"
DAYS_TO_KEEP=30
BACKUP_DIR="/backup/logs"
DRY_RUN=true  # 设置为true时只显示不删除
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m' # No Color
echo -e "${GREEN}[INFO]${NC} 日志清理脚本启动"
# 创建备份目录
mkdir -p $BACKUP_DIR
# 查找要清理的文件
OLD_FILES=$(find $LOG_DIR -name "*.log" -type f -mtime +$DAYS_TO_KEEP)
if [ -z "$OLD_FILES" ]; then
    echo -e "${GREEN}[INFO]${NC} 没有需要清理的文件"
    exit 0
fi
echo "以下文件将被清理:"
echo "$OLD_FILES"
if [ "$DRY_RUN" = true ]; then
    echo -e "${GREEN}[INFO]${NC} 预运行模式,未实际删除文件"
    exit 0
fi
# 备份后再删除
echo "$OLD_FILES" | while read file; do
    if [ -f "$file" ]; then
        # 备份
        cp "$file" "$BACKUP_DIR/"
        # 删除原文件
        rm -f "$file"
        echo "已清理: $file"
    fi
done
echo -e "${GREEN}[INFO]${NC} 日志清理完成"

Python 脚本(跨平台)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
日志清理脚本
支持 Linux、Windows、macOS
"""
import os
import time
import logging
from datetime import datetime, timedelta
# 配置
LOG_CONFIGS = [
    {
        "path": "/var/log/myapp",
        "days": 7,
        "pattern": ".log"
    },
    {
        "path": "/var/log/nginx",
        "days": 14,
        "pattern": ".log"
    }
]
def setup_logger():
    """设置日志记录"""
    logging.basicConfig(
        level=logging.INFO,
        format='%(asctime)s - %(levelname)s - %(message)s',
        handlers=[
            logging.FileHandler('/var/log/log_cleanup.log'),
            logging.StreamHandler()
        ]
    )
    return logging.getLogger(__name__)
def clean_old_logs(log_path, days_to_keep, file_pattern):
    """清理指定目录的旧日志"""
    logger = logging.getLogger(__name__)
    cutoff_time = time.time() - (days_to_keep * 86400)  # 86400秒 = 1天
    if not os.path.exists(log_path):
        logger.warning(f"目录不存在: {log_path}")
        return
    cleaned_count = 0
    for root, dirs, files in os.walk(log_path):
        for file in files:
            if not file.endswith(file_pattern):
                continue
            file_path = os.path.join(root, file)
            try:
                # 获取文件修改时间
                file_mtime = os.path.getmtime(file_path)
                # 如果文件超过保留天数
                if file_mtime < cutoff_time:
                    # 删除文件
                    os.remove(file_path)
                    cleaned_count += 1
                    logger.info(f"已清理: {file_path}")
            except Exception as e:
                logger.error(f"清理文件失败 {file_path}: {str(e)}")
    if cleaned_count > 0:
        logger.info(f"总共清理了 {cleaned_count} 个文件")
    else:
        logger.info("没有需要清理的文件")
def main():
    """主函数"""
    logger = setup_logger()
    logger.info("=" * 50)
    logger.info("日志清理开始")
    for config in LOG_CONFIGS:
        clean_old_logs(
            config["path"],
            config["days"],
            config["pattern"]
        )
    logger.info("日志清理完成")
if __name__ == "__main__":
    main()

Windows PowerShell 脚本

# 日志清理脚本 (Windows)
# 保存为 clean-logs.ps1
$LogPaths = @(
    "C:\logs\app1\*.log",
    "C:\logs\app2\*.log"
)
$DaysToKeep = 30
function Clean-Logs {
    param(
        [string]$Path,
        [int]$DaysOld
    )
    $CutoffDate = (Get-Date).AddDays(-$DaysOld)
    Write-Host "清理目录: $Path" -ForegroundColor Green
    # 查找旧文件
    $OldFiles = Get-ChildItem -Path $Path -Recurse | 
                Where-Object { $_.CreationTime -lt $CutoffDate }
    if ($OldFiles.Count -eq 0) {
        Write-Host "没有需要清理的文件" -ForegroundColor Yellow
        return
    }
    Write-Host "找到 $($OldFiles.Count) 个旧文件" -ForegroundColor Yellow
    # 删除文件
    foreach ($File in $OldFiles) {
        try {
            Remove-Item -Path $File.FullName -Force
            Write-Host "已删除: $($File.FullName)" -ForegroundColor Gray
        }
        catch {
            Write-Error "删除失败: $($File.FullName): $($_.Exception.Message)"
        }
    }
    Write-Host "清理完成" -ForegroundColor Green
}
# 执行清理
foreach ($Path in $LogPaths) {
    Clean-Logs -Path $Path -DaysOld $DaysToKeep
}
# 记录日志
$LogEntry = "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] 日志清理完成"
Add-Content -Path "C:\logs\cleanup.log" -Value $LogEntry

crontab 配置(Linux 定时执行)

# 每天凌晨2点执行日志清理
0 2 * * * /path/to/cleanup.sh
# 每天凌晨3点执行,并记录日志
0 3 * * * /path/to/cleanup.sh > /var/log/cleanup_cron.log 2>&1
# 每周日凌晨1点执行
0 1 * * 0 /path/to/cleanup.sh

使用建议

  1. 先测试后使用:在正式环境使用前先测试
  2. 保留备份:重要日志建议先备份再删除
  3. 设置合适的保留期:根据业务需求确定
  4. 添加错误处理:确保脚本健壮性
  5. 记录操作日志:便于追踪问题

选择哪个脚本取决于您的操作系统和需求,Linux 推荐使用 Shell 脚本,Windows 推荐 PowerShell,需要跨平台则选择 Python。

抱歉,评论功能暂时关闭!