专题名称: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):



'作者:柳永法(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

?

?
?
'作者:柳永法(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?
?



有时我拿到别人的代码时我得写一堆东西来测试,现在这个如果让您去测试的话,您不会直接在服务器上测试吧,所以,以下再贴出本人柳永法的测试脚本,主要是在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。
最新资讯
涨价,就能让共享单车盈利?

涨价,就能让共享单车盈

虽然不打价格战早已是共享单车行业的共识,但节省成本、
试点5G版“场景革命”  银行竞相上演变形记

试点5G版“场景革命”

银行是一个地方,还是一种行为?
游戏厂商出海下半场:赚钱在欧美 赚吆喝在东南亚

游戏厂商出海下半场:赚

2018年出海成为国内众多游戏公司的“标配”。
国家人工智能开放创新平台将迎来新一轮扩围

国家人工智能开放创新

国家人工智能开放创新平台即将迎来新一轮扩围。

hg3028vip

豆瓣书店,已营业14年,62平方米,2万册书,每天固定早9点开门
“傍上”腾讯 任天堂三战中国市场

“傍上”腾讯 任天堂

时隔4个月,任天堂与腾讯的合作终于有了新消息。
最新文章
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编程之文件目录操作常用方