本文目录导读:

自动化脚本清理日志文件通常涉及删除过期文件、压缩归档和截断文件内容等操作,根据你的操作系统(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 "日志清理完成。"
定时执行(任务计划程序):
- 打开“任务计划程序”。
- 创建基本任务,设置触发器(例如每天凌晨)。
- 操作选择“启动程序”,程序为
powershell.exe。 - 参数添加:
-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 Manager、LogMX等。
高级技巧与最佳实践
- 不要直接删除正在写入的文件:程序可能崩溃或丢失日志,使用
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 |
无论使用哪种方法,先测试再部署,并在脚本中添加日志记录,以便追踪清理操作。