专题名称:IIS日志清理专题,CMD版,VBS版,JS版,WSH版

应用:主要用与虚拟主机,也可用于个人服务器

产生背景:2005年某月某日,一向运行正常的虚拟主机死机了,让机房值班人员重启数次,都不成,接显示器进系统看,提示:C盘空间不足,半夜还得去机房处理,到机房后先断网,再进系统发现有两个地方有问题,C:WINDOWSsystem32LogFiles文件有6G,还有一个就是Symantec隔离病毒的地方,到网上找了下,最大可能性是我们的虚拟主机的所有日志都写在这里,并且没人知道写在这里,郁闷,在IIS里看了下,还真是这么回事,日志天天都在长,当时公司订单很多也没人关注这个,当时清理了一下,系统正常,回到公司后把IIS日志改到别的盘了。

解决方案:不过这不是最终解决方法呀,一个虚拟主机几百个站点呢,有的站点一天就能产生几百M的日志文件,还得及时清理。
与是有了两种解决方案:
1.每天清理前60天的日志
2.过段时间清理一下60天前的日志。
不过哪种方法都得采用技术处理,人工去删除 的话除非你很专业,可以查找60天前的日志文件来删除,不过即便你技术很好,这种方法也是很费时的,最好的方法是:使用DOS批处理或脚本来实现,可使用到的脚本主要是vbs与js.

在下边的解决方案里有几种方法大家可以选择适合自己的,他们的总的设计思路是这样的:

IIS日志文件的格式是:ex年月日.log 比如:ex071116.log
IIS日志文件存储位置:默认情况下是在:%windir%system32LogFiles ,如果您使用的是专业的IIS管理软件,里面一般会让你设置相应日志目录

IIS日志清理CMD版:跟据当前时间计算出前N天的日期,比如今天是:2007-11-16,前60天的日期就是2007-9-16(程序可以自动识别30天或31天或润月),然后再处理成20070916这样的格式,然后再组合成ex070916.log这样的IIS日志文件格式,这样一来我们就得到的要清理的日志文件名然后,我们再使用del /s /f d:iislogex070916.log 来清除日志所在文件夹目录及子目录下的所有这个文件名的文件了,从而清除志,但这个仅仅是清除一天的日志,所以我们还得把这个批处理加到计划任务里,让它每天定时执行,这样一来,所有的计算机的日志问题我们就可以不用管了。

IIS日志清理VBS版:VBS版理论是没有iis版快,因为他还要借助脚本驱动,而不像cmd版直接使用dos系统的批处理功能快(猜的),VBS毕竟是高级语言,处理日期的能力用一句话就实现了,而CMD版得写半页。IIS日志清理VBS版的实现用VBS遍历IIS日志所在目录下的所有文件,及文件夹,然后取文件名组合成日期型的,然后当前日期-这个日期,看看是不是超过了设定的天数,超过的话delete,这种思路有个好处就是一次可以清除N天前的所有记录,而不是只是一天的,他可以你CMD版日志清理一样,把这个脚本写到计划任务里,天天运行,也可以过一段时间手动运行一次。这个代码明显比IIS日志清理CMD版少了。

IIS日志清理JS版:这个版其实与IIS日志清理VBS版差不了多少,思路都是一样的,只是使用的脚本语言不一样而已,还有就是调用时的两个参数里的每一个参数:目录,这个目录得写成:D:iislog,以前都用vbs还当主要脚本,这次主要是要学C#了,听说这两种语言都差不多,正好也练习下,也没花多少时间。

IIS日志清理WSH版:WSH版其实是最简单的,因为他的集成化程度很高,操作过程是这样的:使用vbs或js生成要处理的文件的文件名,然后再使用WScript.Shell执行cmd命令来处理,利用了IIS日志清理CMD版及IIS日志清理VBS版的优点,这个也是一次只能处理一天的日志,当然您也可以把它改成处理多天的日志。正因为WSH集成化程度高,可以执行很多操作,所以黑客们都很喜欢这个,用的最多的也就是WScript.Shell,所以一般安全意识比较高的服务器提供商都会把这个组件给禁用掉,这样一来,这个最好用的功能就变成了最不能使用的,通用性最差的了。

实例代码:

IIS日志清理CMD版代码(DelIISLog.cmd):


@echo off 
::设置当前日期前多少天或后多少天 
set/a beforedays=-3 
::设置目录所在位置 
set dir="F:log" 
::当前日期转换为天数并进行计算 
call :Date2Day %date:~0,10% days
set/a days=%days%%beforedays% 
call :Day2Date %days% lastdate 
::计算完毕,生成想要的字符组合 
set okstr=ex%lastdate:~2,6%.log 
::删除这些文件 
del del /f /s /q %dir%%okstr% 


cmd /k

:Date2Day
setlocal ENABLEEXTENSIONS
for /f "tokens=1-3 delims=/-, " %%a in ('echo/%1') do (
set yy=%%a & set mm=%%b & set dd=%%c
)
set /a dd=100%dd%%%100,mm=100%mm%%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
endlocal&set %2=%j%&goto :EOF

:Day2Date
setlocal ENABLEEXTENSIONS
set /a i=%1,a=i+2472632,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a
set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5
set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10 
(if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
endlocal&set %2=%yy%%mm%%dd%&goto :EOF

IIS日志清理VBS版代码(DelIISLog.vbs):

'IIS日志清理VBS版代码(DelIISLog.vbs)Made by www.yongfa365.com
'调用方法:DelIISLog "IIS日志所在路径",保留多少天的IIS日志

'遍历IIS日志文件夹下的所有文件及子文件夹下的文件
Function DelIISLog(IISLogPath,KeepDays)
on error resume next 
Set oFso = CreateObject("Scripting.FileSystemObject")
Set oFolder = oFso.GetFolder(IISLogPath)
Set oSubFolders = oFolder.SubFolders'得到该目录下所有的文件夹的集合
Set oFiles = oFolder.Files '得到该目录下所有的文件的集合
'第一步处理当前目录下的所有文件
For Each oFile In oFiles '遍历所有文件
if right(oFile.name,3)="log" then 
oDate=cdate("20" & mid(oFile.name,3,2) & "-" & mid(oFile.name,5,2) & "-" & mid(oFile.name,7,2))
if date-oDate > KeepDays then oFile.delete '判断是不是要处理的IIS日志文件,如果是的话直接删除
end if 
Next 
'第二步处理当前目录下的所有目录,进行递归调用
For Each oSubFolder In oSubFolders
DelIISLog oSubFolder.Path,KeepDays '递归
Next 

End Function 

DelIISLog "D:IISLogTest",20 '遍历 

'IIS日志清理VBS版代码(DelIISLog.vbs)Made by www.yongfa365.com 
'调用方法:DelIISLog "IIS日志所在路径",保留多少天的IIS日志 

'遍历IIS日志文件夹下的所有文件及子文件夹下的文件 
Function DelIISLog(IISLogPath,KeepDays) 
on error resume next 
Set oFso = CreateObject("Scripting.FileSystemObject") 
Set oFolder = oFso.GetFolder(IISLogPath) 
Set oSubFolders = oFolder.SubFolders'得到该目录下所有的文件夹的集合 
Set oFiles = oFolder.Files '得到该目录下所有的文件的集合 
'第一步处理当前目录下的所有文件 
For Each oFile In oFiles '遍历所有文件 
if right(oFile.name,3)="log" then 
oDate=cdate("20" & mid(oFile.name,3,2) & "-" & mid(oFile.name,5,2) & "-" & mid(oFile.name,7,2)) 
if date-oDate > KeepDays then oFile.delete '判断是不是要处理的IIS日志文件,如果是的话直接删除 
end if 
Next 
'第二步处理当前目录下的所有目录,进行递归调用 
For Each oSubFolder In oSubFolders 
DelIISLog oSubFolder.Path,KeepDays '递归 
Next 

End Function 

DelIISLog "D:IISLogTest",20 

'遍历IIS日志清理JS版代码(DelIISLog.js):

//IIS日志清理JS版代码(DelIISLog.js)Made by www.yongfa365.com
//调用方法:DelIISLog("IIS日志所在路径",保留多少天的IIS日志);

//遍历IIS日志文件夹下的所有文件及子文件夹下的文件
function DelIISLog(IISLogPath,KeepDays){
var fso = new ActiveXObject("Scripting.FileSystemObject");
var f = fso.GetFolder(IISLogPath);
var Folders = new Enumerator(f.SubFolders); //得到该目录下所有的文件夹的集合
var Files = new Enumerator(f.Files); //得到该目录下所有的文件的集合
//第一步处理当前目录下的所有文件
for (; !Files.atEnd(); Files.moveNext()) {
var fileName = Files.item().name;
var year = "20" + fileName.substr(2, 2);
var mouth = fileName.substr(4, 2);
var day = fileName.substr(6, 2);
var days = Math.round(((new Date()).getTime() - Date.UTC(year, mouth - 1, day)) / 1000 / 60 / 60 / 24);
if (days > KeepDays) Files.item().Delete(); //判断是不是要处理的IIS日志文件,如果是的话直接删除
}
//第二步处理当前目录下的所有目录,进行递归调用
for (; !Folders.atEnd(); Folders.moveNext()) {
DelIISLog(Folders.item(),KeepDays);
}
}
//调用函数,比如:"F:log",5或 "C:windowssystem32LogFiles",5
DelIISLog("D:IISLogTest",2); 

//IIS日志清理JS版代码(DelIISLog.js)Made by www.yongfa365.com 
//调用方法:DelIISLog("IIS日志所在路径",保留多少天的IIS日志); 

//遍历IIS日志文件夹下的所有文件及子文件夹下的文件 
function DelIISLog(IISLogPath,KeepDays){ 
var fso = new ActiveXObject("Scripting.FileSystemObject"); 
var f = fso.GetFolder(IISLogPath); 
var Folders = new Enumerator(f.SubFolders); //得到该目录下所有的文件夹的集合 
var Files = new Enumerator(f.Files); //得到该目录下所有的文件的集合 
//第一步处理当前目录下的所有文件 
for (; !Files.atEnd(); Files.moveNext()) { 
var fileName = Files.item().name; 
var year = "20" + fileName.substr(2, 2); 
var mouth = fileName.substr(4, 2); 
var day = fileName.substr(6, 2); 
var days = Math.round(((new Date()).getTime() - Date.UTC(year, mouth - 1, day)) / 1000 / 60 / 60 / 24); 
if (days > KeepDays) Files.item().Delete(); //判断是不是要处理的IIS日志文件,如果是的话直接删除 

//第二步处理当前目录下的所有目录,进行递归调用 
for (; !Folders.atEnd(); Folders.moveNext()) { 
DelIISLog(Folders.item(),KeepDays); 


//调用函数,比如:"F:log",5或 "C:windowssystem32LogFiles",5 
DelIISLog("D:IISLogTest",2);

IIS日志清理WSH版代码(DelIISLog.wsf):

<job id="IIS日志清理WSH版代码(DelIISLog.wsf) ">
<script language="vbscript">
'作者:柳永法(yongfa365)'Blog
'修改:2007-11-15
'操作说明:此文件只能清除一天的日志,得使用计划任务让其每天执行一次,因为服务器上一般都禁用WScript.Shell,所以不推荐使用
Function DelIISLog(IISLogPath,beforedays)
d=Now-beforedays
If Right(IISLogPath,1) <> "" Then IISLogPath=IISLogPath & ""
p= IISLogPath & "ex" & Right(Year(d),2) & Right("0" & Month(d),2)& Right("0" & Day(d),2)& ".Log" 
Set WshShell = WScript.CreateObject("WScript.Shell")
wscript.echo p
WshShell.Run ("cmd.exe /c del /s " & p)
Set WshShell = Nothing 
End Function 

DelIISLog "D:IISLogTest",2
</script>
</job> 

<job id="IIS日志清理WSH版代码(DelIISLog.wsf) Made by www.yongfa365.com"> 
<script language="vbscript"> 
'作者:柳永法(yongfa365)'Blog 
'修改:2007-11-15 
'操作说明:此文件只能清除一天的日志,得使用计划任务让其每天执行一次,因为服务器上一般都禁用WScript.Shell,所以不推荐使用 
Function DelIISLog(IISLogPath,beforedays) 
d=Now-beforedays 
If Right(IISLogPath,1) <> "" Then IISLogPath=IISLogPath & "" 
p= IISLogPath & "ex" & Right(Year(d),2) & Right("0" & Month(d),2)& Right("0" & Day(d),2)& ".Log" 
Set WshShell = WScript.CreateObject("WScript.Shell") 
wscript.echo p 
WshShell.Run ("cmd.exe /c del /s " & p) 
Set WshShell = Nothing 
End Function 

DelIISLog "D:IISLogTest",2 
</script> 
</job>


有时我拿到别人的代码时我得写一堆东西来测试,现在这个如果让您去测试的话,您不会直接在服务器上测试吧,所以,以下再贴出本人柳永法的测试脚本,主要是在D盘生成一个测试文件夹,及一些IIS测试日志文件,

IIS日志清理之IIS日志生成系统(CreateIISLog.vbs):

'IIS日志清理之IIS日志生成系统(CreateIISLog.vbs) 
'创建文件夹 
Function CreateFolder(Folder) 
On Error Resume Next
Set FSO = CreateObject("Scripting.FileSystemObject") 
FSO.CreateFolder(Folder) 
If Err>0 Then
Err.Clear
CreateFolder = False
Else
CreateFolder = True
End If
End Function
'创建文件 
Function CreateFile(FileName, Content) 
On Error Resume Next
Set FSO = CreateObject("Scripting.FileSystemObject") 
Set fd = FSO.CreateTextFile(FileName, True) 
fd.WriteLine Content 
If Err>0 Then
Err.Clear
CreateFile = False
Else
CreateFile = True
End If
End Function


CreateFolder "D:IISLogTest"
CreateFolder "D:IISLogTestIISLogs001"
CreateFolder "D:IISLogTestIISLogs002"
CreateFolder "D:IISLogTestIISLogs003"
for i=1 to 30 
d=date-i 
filename="ex" & right(year(d),2) & right("0" & month(d),2) & right("0" & day(d),2) & ".log"
CreateFile "D:IISLogTest" & filename,Content 
CreateFile "D:IISLogTestIISLogs001" & filename,Content 
CreateFile "D:IISLogTestIISLogs002" & filename,Content 
CreateFile "D:IISLogTestIISLogs003" & filename,Content 
next

'IIS日志清理之IIS日志生成系统(CreateIISLog.vbs)

'创建文件夹 
Function CreateFolder(Folder) 
On Error Resume Next 
Set FSO = CreateObject("Scripting.FileSystemObject") 
FSO.CreateFolder(Folder) 
If Err>0 Then 
Err.Clear 
CreateFolder = False 
Else 
CreateFolder = True 
End If 
End Function 
'创建文件 
Function CreateFile(FileName, Content) 
On Error Resume Next 
Set FSO = CreateObject("Scripting.FileSystemObject") 
Set fd = FSO.CreateTextFile(FileName, True) 
fd.WriteLine Content 
If Err>0 Then 
Err.Clear 
CreateFile = False 
Else 
CreateFile = True 
End If 
End Function 


CreateFolder "D:IISLogTest" 
CreateFolder "D:IISLogTestIISLogs001" 
CreateFolder "D:IISLogTestIISLogs002" 
CreateFolder "D:IISLogTestIISLogs003" 
for i=1 to 30 
d=date-i 
filename="ex" & right(year(d),2) & right("0" & month(d),2) & right("0" & day(d),2) & ".log" 
CreateFile "D:IISLogTest" & filename,Content 
CreateFile "D:IISLogTestIISLogs001" & filename,Content 
CreateFile "D:IISLogTestIISLogs002" & filename,Content 
CreateFile "D:IISLogTestIISLogs003" & filename,Content 
next 

后记:这个方法不仅可以用在IIS日志处理方面,还可以用在处理Serv-U的日志处理,前提条件是Serv-U的日志文件的格式也得设成像IIS日志这样的格式ex071115.log。

最新资讯
媒体会挤满滴滴高管 顺风车依旧无上线时间表

媒体会挤满滴滴高管

但即使做了这么多有关安全的调整,包括柳青在内的滴滴高
小鹏汽车连发补救措施挽人心

小鹏汽车连发补救措施

小鹏汽车正在制定新的补偿方案,包括三年6折保值换购或
亚马逊败走 图书电商巨头四进三

亚马逊败走 图书电商

用户增长的红利正逐渐消失。为了能够稳定自身的业务规
滴滴取消顺风车附近接单

滴滴取消顺风车附近接

未来将在白天试运行顺风车,并在试运行期间免收车主信息
北京ETC卡不必担心被盗刷

北京ETC卡不必担心被

北京地区近几年发行的ETC速通卡并不具有金融功能,只能
欧盟批准220亿美元收购 沃达丰成欧洲最大综合运营商

欧盟批准220亿美元收

去年5月,沃达丰宣布将收购Liberty Global的德国和中欧
最新文章
rational对象脚本命令

rational对象脚本命令

对象脚本命令使用robot录制的脚本在实际的测试使用中,
用CE5.2版找武林外传一级基址的方法(图文教程)

用CE5.2版找武林外传

好帖子,正好解决了我的遇到的瓶颈问题,收藏一下
可与Spreadsheets媲美的在线表格系统:EditGrid

可与Spreadsheets媲美

EditGrid网址:http://www.editgrid.com/home有中文版
在InstallShield中引用WINSOCK 的示例代码

在InstallShield中引

通过以下示例,InstallShield可以用WINSOCK获取IP地址,可
用InstallShield检测是否安装IIS的脚本

用InstallShield检测

可以通过检测以下两个注册表值来检查是否安装了IISHKE
Erlang IO编程之文件目录操作常用方法小结

Erlang IO编程之文件

这篇文章主要介绍了ErlangIO编程之文件目录操作常用方