Windows服务器IIS日志清理
IIS日志默认按天写入,长时间不清理会占满系统盘,导致网站无法访问。
本文面向零基础运维人员,讲解如何通过PowerShell脚本自动将旧日志归档为ZIP文件,并配合任务计划程序定时执行,最终实现日志自动清理与备份。
先确认日志目录和保留策略
动手前需要知道IIS把日志写在哪里。
默认路径是 C:\inetpub\logs\LogFiles,但很多服务器会修改到其他盘。
打开IIS管理器,点击左侧服务器名称,双击“日志”图标,查看“目录”字段的实际路径。
保留策略建议根据磁盘空间和合规要求决定。
一般保留30到90天,归档文件可以保留更久。
本文示例保留最近7天日志,超过7天的自动压缩归档到 D:\IISLogArchive。
编写PowerShell自动归档脚本
在 D:\Scripts 下新建 Archive-IISLogs.ps1,内容如下。
脚本会遍历日志目录下的子文件夹,找出最后修改时间超过7天的 .log 文件,压缩到指定归档目录,并删除原文件。
$LogRoot = "C:\inetpub\logs\LogFiles"
$ArchiveRoot = "D:\IISLogArchive"
$DaysToKeep = 7
$CutoffDate = (Get-Date).AddDays(-$DaysToKeep)
if (-not (Test-Path $ArchiveRoot)) {
New-Item -ItemType Directory -Path $ArchiveRoot | Out-Null
}
Get-ChildItem -Path $LogRoot -Recurse -Filter "*.log" | Where-Object {
$_.LastWriteTime -lt $CutoffDate
} | ForEach-Object {
$RelativePath = $_.FullName.Substring($LogRoot.Length).TrimStart('\')
$ArchiveName = ($RelativePath -replace '\\', '_') + ".zip"
$ArchivePath = Join-Path $ArchiveRoot $ArchiveName
Compress-Archive -Path $_.FullName -DestinationPath $ArchivePath -Force
Remove-Item $_.FullName -Force
}
注意:Compress-Archive 在PowerShell 5.0及以上版本可用。
如果服务器是Windows Server 2012 R2,请先确认PowerShell版本,版本过低需改用其他压缩方式。
用任务计划程序定时执行
打开“任务计划程序”,点击右侧“创建任务”。
常规选项卡中勾选“使用最高权限运行”,配置选择对应的Windows版本。
触发器选项卡新建触发器,设置为“每天”,时间建议凌晨3点,并勾选“启用”。
操作选项卡新建操作,程序或脚本填 powershell.exe,添加参数填 -ExecutionPolicy Bypass -File D:\Scripts\Archive-IISLogs.ps1。
条件选项卡中取消勾选“只有在计算机使用交流电源时才启动此任务”,避免笔记本或虚拟机因电源策略不执行。
设置选项卡中勾选“如果任务失败,按以下频率重新启动”,间隔10分钟,尝试3次。
避坑指南:权限、路径与压缩失败
权限不足:任务计划程序默认以当前用户运行,可能没有权限删除IIS日志。
建议在“常规”中改为“不管用户是否登录都要运行”,并输入管理员账户密码。
路径含空格:如果日志目录或归档目录包含空格,脚本中的路径变量必须用引号包裹,否则会报错。
压缩失败:Compress-Archive 遇到正在写入的日志文件可能失败。
建议在脚本开头增加判断,跳过最后修改时间在1小时内的文件,或者将任务安排在凌晨低峰期执行。
归档文件重复:如果同名ZIP已存在,脚本中使用了 -Force 会覆盖。
若希望保留历史版本,可改用时间戳命名,例如 $ArchiveName = ($RelativePath -replace '\\','_') + "_" + (Get-Date -Format "yyyyMMddHHmmss") + ".zip"。
验证归档是否生效
执行脚本后,检查 D:\IISLogArchive 目录是否出现ZIP文件,同时确认原日志目录中超过7天的 .log 文件已被删除。
可以手动运行一次脚本:打开PowerShell,执行 -File D:\Scripts\Archive-IISLogs.ps1,观察是否有报错。
在任务计划程序中右键任务,选择“运行”,然后查看“上次运行结果”是否为 0x0。
如果返回其他代码,可结合“历史记录”选项卡中的事件详情排查。
判断标准:归档目录出现按日期命名的ZIP文件,且原日志目录中旧文件消失,即表示自动归档脚本工作正常。
常见疑问
脚本可以处理子文件夹吗? 可以。
示例中使用了 -Recurse 参数,会递归查找所有子目录下的 .log 文件。
归档后需要手动删除ZIP吗? 建议根据磁盘容量设置二次清理策略,例如再写一个脚本删除超过180天的ZIP文件,同样通过任务计划程序执行。
IIS日志正在被占用怎么办? IIS会保持当前日志文件打开,但历史日志通常已关闭。
如果遇到占用错误,可将 $DaysToKeep 调大,确保只处理已关闭的文件。
能否只清理不归档? 可以,去掉 Compress-Archive 那行即可,但归档能保留排查问题的依据,建议保留。
按照以上步骤配置后,Windows服务器IIS日志清理与自动归档脚本就能稳定运行,磁盘空间不会再被日志悄悄占满。