找回密码
 注册
搜索
热搜: 回贴

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

2010-1-31 08:14| 发布者: admin| 查看: 148| 评论: 0|原作者: 墨元

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

关键词:IIS日志清理,日志清理,IIS日志清理CMD版,IIS日志清理VBS版,IIS日志清理JS版,IIS日志清理WSH版

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

产生背景: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 Made by www.yongfa365.com
::设置当前日期前多少天或后多少天
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):
view plaincopy to clipboardprint?

1. 'IIS日志清理VBS版代码(DelIISLog.vbs) Made by www.yongfa365.com
2. '调用方法:DelIISLog "IIS日志所在路径",保留多少天的IIS日志
3.
4. '遍历IIS日志文件夹下的所有文件及子文件夹下的文件
5. Function DelIISLog(IISLogPath,KeepDays)
6. on error resume next
7. Set oFso = CreateObject("Scripting.FileSystemObject")
8. Set oFolder = oFso.GetFolder(IISLogPath)
9. Set oSubFolders = oFolder.SubFolders '得到该目录下所有的文件夹的集合
10. Set oFiles = oFolder.Files '得到该目录下所有的文件的集合
11. '第一步处理当前目录下的所有文件
12. For Each oFile In oFiles '遍历所有文件
13. if right(oFile.name,3)="log" then
14. oDate=cdate("20" & mid(oFile.name,3,2) & "-" & mid(oFile.name,5,2) & "-" & mid(oFile.name,7,2))
15. if date-oDate > KeepDays then oFile.delete '判断是不是要处理的IIS日志文件,如果是的话直接删除
16. end if
17. Next
18. '第二步处理当前目录下的所有目录,进行递归调用
19. For Each oSubFolder In oSubFolders
20. DelIISLog oSubFolder.Path,KeepDays '递归
21. Next
22.
23. End Function
24.
25. 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):
view plaincopy to clipboardprint?

1. //IIS日志清理JS版代码(DelIISLog.js) Made by www.yongfa365.com
2. //调用方法:DelIISLog("IIS日志所在路径",保留多少天的IIS日志);
3.
4. //遍历IIS日志文件夹下的所有文件及子文件夹下的文件
5. function DelIISLog(IISLogPath,KeepDays){
6. var fso = new ActiveXObject("Scripting.FileSystemObject");
7. var f = fso.GetFolder(IISLogPath);
8. var Folders = new Enumerator(f.SubFolders); //得到该目录下所有的文件夹的集合
9. var Files = new Enumerator(f.Files); //得到该目录下所有的文件的集合
10. //第一步处理当前目录下的所有文件
11. for (; !Files.atEnd(); Files.moveNext()) {
12. var fileName = Files.item().name;
13. var year = "20" + fileName.substr(2, 2);
14. var mouth = fileName.substr(4, 2);
15. var day = fileName.substr(6, 2);
16. var days = Math.round(((new Date()).getTime() - Date.UTC(year, mouth - 1, day)) / 1000 / 60 / 60 / 24);
17. if (days > KeepDays) Files.item().Delete(); //判断是不是要处理的IIS日志文件,如果是的话直接删除
18. }
19. //第二步处理当前目录下的所有目录,进行递归调用
20. for (; !Folders.atEnd(); Folders.moveNext()) {
21. DelIISLog(Folders.item(),KeepDays);
22. }
23. }
24. //调用函数,比如:"F:\\log",5 或 "C:\\windows\\system32\\LogFiles",5
25. 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:\\windows\\system32\\LogFiles",5
DelIISLog("D:\\IISLogTest",2);

IIS日志清理WSH版代码(DelIISLog.wsf):
view plaincopy to clipboardprint?

1.
2.
18.






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

IIS日志清理之IIS日志生成系统(CreateIISLog.vbs):
view plaincopy to clipboardprint?

1. 'IIS日志清理之IIS日志生成系统(CreateIISLog.vbs) Made by www.yongfa365.com
2. '创建文件夹
3. Function CreateFolder(Folder)
4. On Error Resume Next
5. Set FSO = CreateObject("Scripting.FileSystemObject")
6. FSO.CreateFolder(Folder)
7. If Err>0 Then
8. Err.Clear
9. CreateFolder = False
10. Else
11. CreateFolder = True
12. End If
13. End Function
14. '创建文件
15. Function CreateFile(FileName, Content)
16. On Error Resume Next
17. Set FSO = CreateObject("Scripting.FileSystemObject")
18. Set fd = FSO.CreateTextFile(FileName, True)
19. fd.WriteLine Content
20. If Err>0 Then
21. Err.Clear
22. CreateFile = False
23. Else
24. CreateFile = True
25. End If
26. End Function
27.
28.
29. CreateFolder "D:\IISLogTest"
30. CreateFolder "D:\IISLogTest\IISLogs001"
31. CreateFolder "D:\IISLogTest\IISLogs002"
32. CreateFolder "D:\IISLogTest\IISLogs003"
33. for i=1 to 30
34. d=date-i
35. filename="ex" & right(year(d),2) & right("0" & month(d),2) & right("0" & day(d),2) & ".log"
36. CreateFile "D:\IISLogTest\" & filename,Content
37. CreateFile "D:\IISLogTest\IISLogs001\" & filename,Content
38. CreateFile "D:\IISLogTest\IISLogs002\" & filename,Content
39. CreateFile "D:\IISLogTest\IISLogs003\" & filename,Content
40. next

'IIS日志清理之IIS日志生成系统(CreateIISLog.vbs) Made by www.yongfa365.com
'创建文件夹
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
next


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

最新评论

相关分类

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-29 13:16 , Processed in 0.107830 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

返回顶部