我刚刚发现 IIS 会无限期地累积日志,而且似乎没有任何 IIS 设置可以自动清除旧日志文件。有什么最佳方法可以控制我的 IIS 日志,使它们不会填满整个硬盘?
答案1
您必须运行计划任务才能执行此操作。这是一个应该可以使用的 Powershell 脚本。
set-location c:\windows\system32\Logfiles\W3SVC1\ -ErrorAction Stop
foreach ($File in get-childitem -include *.log) {
if ($File.LastWriteTime -lt (Get-Date).AddDays(-30)) {
del $File
}
}
这应该会清除 30 天前最后修改的所有内容。将第一行中的路径更改为日志文件的存储位置。同时将 -30 更改为您想要保留文件的时间。-30 表示您将删除 30 天前的所有内容。
你可以看看本文如果您不想使用 LastWriteTime,它会显示 FileInfo 对象的不同属性。
答案2
我目前正在使用一个非常简单的批处理文件脚本执行此操作:
forfiles -p C:\inetpub\logs\LogFiles\ -s -m *.log -d -180 -c "cmd /C DEL @File"
我还做了一个计划任务每天启动它,甚至激活该文件夹的文件压缩功能:所有这些一起彻底解决了我的 IIS 文件问题。
批处理文件中开关的解释:
- -s 或 /S :递归到所有子文件夹
- -p 或 /P :路径
- -m 或 /M :文件掩码
- -d 或 /D :天数(-180 = 超过 180 天)
- -c 或 /C :要执行的命令
如果你正在寻找一个可行的电源外壳另见另一个答案:有关如何正确减少 IIS LogFiles 文件夹的其他建议,查看此帖子。
答案3
你可以自己酿造,但我相信一些聪明的人已经为你写好了。看看IIS日志&IISLogs 精简版!
如果您所做的只是删除日志,那么您可以在不需要时关闭日志记录!这将为您的服务器节省大量的 I/O!
答案4
微软建议网站上的脚本。
下面是我根据自己的需要使用的修改版本。
Wscript.Echo "Starting log removal"
sLogFolder = "d:\retentiontest"
iMaxAge = 30 'in days
Set objFSO = CreateObject("Scripting.FileSystemObject")
set colFolder = objFSO.GetFolder(sLogFolder)
Wscript.Echo "Removing log files from folder: " & colFolder
For Each colSubfolder in colFolder.SubFolders
Set objFolder = objFSO.GetFolder(colSubfolder.Path)
Set colFiles = objFolder.Files
For Each objFile in colFiles
iFileAge = now-objFile.DateLastModified
if iFileAge > (iMaxAge+1) then
Wscript.Echo "Removing File: " & objFile.Name
objFSO.deletefile objFile, True
end if
Next
Next
请注意,我已将“创建日期”更改为“上次修改日期”,因为违反直觉的是,创建日期可能晚于上次修改日期,复制文件的情况也是如此。您可能不想删除最近更新的文件。
然后使用 cscript.exe 运行它(例如cscript.exe d:\scripts\logRetentionScript.vbs
)。