本文目录导读:

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
使用建议
- 先测试后使用:在正式环境使用前先测试
- 保留备份:重要日志建议先备份再删除
- 设置合适的保留期:根据业务需求确定
- 添加错误处理:确保脚本健壮性
- 记录操作日志:便于追踪问题
选择哪个脚本取决于您的操作系统和需求,Linux 推荐使用 Shell 脚本,Windows 推荐 PowerShell,需要跨平台则选择 Python。