自动化脚本如何清理日志文件

wen 实用脚本 1

本文目录导读:

自动化脚本如何清理日志文件

  1. Linux 环境下的 Shell 脚本(最常用)
  2. Windows 环境下的 PowerShell 脚本(推荐)
  3. 使用系统工具(推荐生产环境)
  4. 高级技巧与最佳实践
  5. 总结:如何选择?

自动化脚本清理日志文件通常涉及删除过期文件压缩归档截断文件内容等操作,根据你的操作系统(Linux/Windows)和日志文件的特点,有多种实现方式。

以下是几种主流且高效的自动化脚本方案:

Linux 环境下的 Shell 脚本(最常用)

Linux 系统通常使用 logrotate 工具,但自己写脚本可以提供更高的灵活性。

方案 A:按天删除(使用 find 命令)

删除指定目录下 N 天前的 .log 文件。

#!/bin/bash
# 日志文件目录
LOG_DIR="/var/log/myapp"
# 保留的天数(30天前的日志将被删除)
DAYS_TO_KEEP=30
# 日志文件后缀(可选,如 *.log 或 *.*)
FILE_PATTERN="*.log"
echo "开始清理 $LOG_DIR 目录下 $DAYS_TO_KEEP 天前的日志文件..."
# 找到文件并删除
find "$LOG_DIR" -name "$FILE_PATTERN" -type f -mtime +$DAYS_TO_KEEP -exec rm -f {} \;
# 可选:删除空目录
find "$LOG_DIR" -type d -empty -delete
echo "日志清理完成。"

定时执行(Crontab):
编辑 crontab:crontab -e
添加一行,每天凌晨 2 点执行:
0 2 * * * /path/to/cleanup_logs.sh

方案 B:压缩并保留(不直接删除)

将超过 7 天的日志压缩成 .gz,删除超过 30 天的 .gz 文件。

#!/bin/bash
LOG_DIR="/var/log/myapp"
COMPRESS_DAYS=7      # 超过7天压缩
DELETE_DAYS=30       # 删除超过30天的压缩包
# 压缩旧日志(跳过已压缩的)
find "$LOG_DIR" -name "*.log" -type f -mtime +$COMPRESS_DAYS -exec gzip {} \;
# 删除超期的压缩日志
find "$LOG_DIR" -name "*.gz" -type f -mtime +$DELETE_DAYS -exec rm -f {} \;

方案 C:截断日志(不删除文件,仅清空内容)

用于程序仍在写入的日志文件(如 Tomcat 的 catalina.out)。
注意:必须先清空再追加,否则会导致数据丢失。

#!/bin/bash
# 截断日志文件(保留文件句柄,防止程序写入失败)
truncate -s 0 /var/log/tomcat/catalina.out
# 或者使用 > 重定向(某些场景更安全)
# > /var/log/nginx/access.log

Windows 环境下的 PowerShell 脚本(推荐)

Windows 没有原生的 logrotate,建议使用 PowerShell 脚本配合任务计划程序。

删除指定天数的日志

# 清理日志脚本 - Cleanup-Logs.ps1
$LogFolder = "C:\AppLogs"
$DaysToKeep = -30  # 保留最近30天
$FilePattern = "*.log"
# 计算截止日期
$CutoffDate = (Get-Date).AddDays($DaysToKeep)
# 获取并删除旧文件
Get-ChildItem -Path $LogFolder -Filter $FilePattern -Recurse |
Where-Object { $_.LastWriteTime -lt $CutoffDate } |
Remove-Item -Force
Write-Host "日志清理完成。"

定时执行(任务计划程序):

  1. 打开“任务计划程序”。
  2. 创建基本任务,设置触发器(例如每天凌晨)。
  3. 操作选择“启动程序”,程序为 powershell.exe
  4. 参数添加:-ExecutionPolicy Bypass -File "C:\Scripts\Cleanup-Logs.ps1"

按文件大小清理(删除最大日志)

$LogPath = "C:\Logs"
$MaxSizeMB = 100  # 如果文件夹超过100MB则清理
$Folder = Get-ChildItem $LogPath -Recurse | Measure-Object -Property Length -Sum
$FolderSizeMB = [math]::Round($Folder.Sum / 1MB, 2)
if ($FolderSizeMB -gt $MaxSizeMB) {
    # 按最后修改时间排序,删除最旧的文件
    Get-ChildItem -Path $LogPath -Filter "*.log" |
    Sort-Object LastWriteTime |
    Select-Object -First 20 |
    Remove-Item -Force
    Write-Host "已清理 $LogPath"
}

使用系统工具(推荐生产环境)

Linux:logrotate(首选)

logrotate 是 Linux 标准日志管理工具,功能强大且稳定。

配置示例 (/etc/logrotate.d/myapp):

/var/log/myapp/*.log {
    daily                  # 每天轮转
    rotate 30              # 保留30个归档
    compress               # 压缩归档
    delaycompress          # 延迟一天压缩(保证文件不被进程占用)
    missingok              # 忽略丢失文件
    notifempty             # 空文件不轮转
    create 0640 root utmp  # 创建新日志文件
    sharedscripts
    postrotate
        # 重启或发送信号(根据你的应用)
        systemctl reload myapp || true
    endscript
}

执行logrotate -vf /etc/logrotate.d/myapp (调试运行)

Windows:日志截断工具

  • Python 脚本(跨平台):
    python -c "import shutil, os; shutil.make_archive('log_backup', 'zip', 'C:\Logs')"
  • 商业工具:如 EventLog ManagerLogMX 等。

高级技巧与最佳实践

  • 不要直接删除正在写入的文件:程序可能崩溃或丢失日志,使用 copy / truncate 方式(Linux: truncate -s 0,Windows: 通过 FileStream 截断)。
  • 区分活跃文件:使用 lsof(Linux)或 Handle.exe(Windows Sysinternals)检查文件是否被占用。
  • 保留文件句柄测试
      # Linux:查找哪些进程正在使用日志文件
      lsof /var/log/myapp/current.log
  • 善用目录结构:按日期分目录 /var/log/myapp/2024/01/,删除整个目录更高效。
  • 安全边界控制:限制脚本只能操作指定目录,防止误删重要系统日志。
  • 通知机制:清理后发送邮件或记录日志到监控系统(echo "清理完成" | mail -s "日志清理报告" admin@example.com)。

如何选择?

环境 推荐方法 原因
Linux 生产环境 logrotate 官方工具,成熟稳定,支持延迟压缩/通知/权限控制
Linux 简单场景 Shell + find 灵活,适合临时或自定义规则
Windows 环境 PowerShell + 任务计划 原生支持,无额外依赖
跨平台/容器环境 Python 统一脚本,可在 Windows/Linux/Docker 中运行
Docker 容器 限制日志大小 启动容器时加 --log-opt max-size=10m --log-opt max-file=3

无论使用哪种方法,先测试再部署,并在脚本中添加日志记录,以便追踪清理操作。

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