IIS日志清理(CMD版,VBS版,JS版,WSH版)
程序员文章站
2022-11-27 20:28:40
应用场合:主要用与虚拟主机,也可用于个人服务器 产生背景:2005 年某月某日,一向运行正常的虚拟主机死机了,让机房值班人员重启数次,都不成,接显示器进系统看,提示:c盘空...
应用场合:主要用与虚拟主机,也可用于个人服务器
产生背景:2005 年某月某日,一向运行正常的虚拟主机死机了,让机房值班人员重启数次,都不成,接显示器进系统看,提示:c盘空间不足,半夜还得去机房处理,到机房后先断网,再进系统发现有两个地方有问题,c:\windows\system32\logfiles文件有6g,还有一个就是symantec隔离病毒的地方,到网上找了下,最大可能性是我们的虚拟主机的所有日志都写在这里,并且没人知道写在这里,郁闷,在iis里看了下,还真是这么回事,日志天天都在长,当时公司订单很多也没人关注这个,当时清理了一下,系统正常,回到公司后把iis日志改到别的盘了。
解决方案:不过这不是最终解决方法呀,一个虚拟主机几百个站点呢,有的站点一天就能产生几百m的日志文件,还得及时清理。
与是有了两种解决方案:
1.每天清理前60天的日志
2.过段时间清理一下60天前的日志。
不过哪种方法都得采用技术处理,人工去删除 的话除非你很专业,可以查找60天前的日志文件来删除,不过即便你技术很好,这种方法也是很费时的,最好的方法是:使用dos批处理或脚本来实现,可使用到的脚本主要是vbs与js.
在下边的解决方案里有几种方法大家可以选择适合自己的,他们的总的设计思路是这样的:
iis日志文件的格式是:ex年月日.log 比如:ex071116.log
iis日志文件存储位置:默认情况下是在:%windir%\system32\logfiles ,如果您使用的是专业的iis管理软件,里面一般会让你设置相应日志目录
iis日志清理cmd版:跟据当前时间计算出前n天的日期,比如今天是:2007-11-16,前60天的日期就是2007-9-16(程序可以自动识别30天或31天或润月),然后再处理成20070916这样的格式,然后再组合成ex070916.log这样的iis日志文件格式,这样一来我们就得到的要清理的日志文件名然后,我们再使用del /s /f d:\iislog\ex070916.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
title
::设置当前日期前多少天或后多少天
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)
'调用方法: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)
//调用方法: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:\\windows\\system32\\logfiles",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>
有时我拿到别人的代码时我得写一堆东西来测试,现在这个如果让您去测试的话,您不会直接在服务器上测试吧,所以,以下再贴出本人柳永法的测试脚本,主要是在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:\iislogtest\iislogs001"
createfolder "d:\iislogtest\iislogs002"
createfolder "d:\iislogtest\iislogs003"
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:\iislogtest\iislogs001\" & filename,content
createfile "d:\iislogtest\iislogs002\" & filename,content
createfile "d:\iislogtest\iislogs003\" & filename,content
后记:这个方法不仅可以用在iis日志处理方面,还可以用在处理serv-u的日志处理,前提条件是serv-u的日志文件的格式也得设成像iis日志这样的格式ex071115.log。
产生背景:2005 年某月某日,一向运行正常的虚拟主机死机了,让机房值班人员重启数次,都不成,接显示器进系统看,提示:c盘空间不足,半夜还得去机房处理,到机房后先断网,再进系统发现有两个地方有问题,c:\windows\system32\logfiles文件有6g,还有一个就是symantec隔离病毒的地方,到网上找了下,最大可能性是我们的虚拟主机的所有日志都写在这里,并且没人知道写在这里,郁闷,在iis里看了下,还真是这么回事,日志天天都在长,当时公司订单很多也没人关注这个,当时清理了一下,系统正常,回到公司后把iis日志改到别的盘了。
解决方案:不过这不是最终解决方法呀,一个虚拟主机几百个站点呢,有的站点一天就能产生几百m的日志文件,还得及时清理。
与是有了两种解决方案:
1.每天清理前60天的日志
2.过段时间清理一下60天前的日志。
不过哪种方法都得采用技术处理,人工去删除 的话除非你很专业,可以查找60天前的日志文件来删除,不过即便你技术很好,这种方法也是很费时的,最好的方法是:使用dos批处理或脚本来实现,可使用到的脚本主要是vbs与js.
在下边的解决方案里有几种方法大家可以选择适合自己的,他们的总的设计思路是这样的:
iis日志文件的格式是:ex年月日.log 比如:ex071116.log
iis日志文件存储位置:默认情况下是在:%windir%\system32\logfiles ,如果您使用的是专业的iis管理软件,里面一般会让你设置相应日志目录
iis日志清理cmd版:跟据当前时间计算出前n天的日期,比如今天是:2007-11-16,前60天的日期就是2007-9-16(程序可以自动识别30天或31天或润月),然后再处理成20070916这样的格式,然后再组合成ex070916.log这样的iis日志文件格式,这样一来我们就得到的要清理的日志文件名然后,我们再使用del /s /f d:\iislog\ex070916.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
title
::设置当前日期前多少天或后多少天
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)
'调用方法: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)
//调用方法: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:\\windows\\system32\\logfiles",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>
有时我拿到别人的代码时我得写一堆东西来测试,现在这个如果让您去测试的话,您不会直接在服务器上测试吧,所以,以下再贴出本人柳永法的测试脚本,主要是在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:\iislogtest\iislogs001"
createfolder "d:\iislogtest\iislogs002"
createfolder "d:\iislogtest\iislogs003"
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:\iislogtest\iislogs001\" & filename,content
createfile "d:\iislogtest\iislogs002\" & filename,content
createfile "d:\iislogtest\iislogs003\" & filename,content
后记:这个方法不仅可以用在iis日志处理方面,还可以用在处理serv-u的日志处理,前提条件是serv-u的日志文件的格式也得设成像iis日志这样的格式ex071115.log。
下一篇: 无法加载php_curl.dll解决办法