IIS日志清理專(zhuān)題,CMD版,VBS版,JS版,WSH版 |
發(fā)布時(shí)間: 2012/7/4 14:03:09 |
專(zhuān)題名稱(chēng):IIS日志清理專(zhuān)題,CMD版,VBS版,JS版,WSH版 關(guān)鍵詞:IIS日志清理,日志清理,IIS日志清理CMD版,IIS日志清理VBS版,IIS日志清理JS版,IIS日志清理WSH版 應(yīng)用場(chǎng)合:主要用與虛擬主機(jī),也可用于個(gè)人服務(wù)器 產(chǎn)生背景:2005 年某月某日,一向運(yùn)行正常的虛擬主機(jī)死機(jī)了,讓機(jī)房值班人員重啟數(shù)次,都不成,接顯示器進(jìn)系統(tǒng)看,提示:C盤(pán)空間不足,半夜還得去機(jī)房處理,到機(jī)房后先斷 網(wǎng),再進(jìn)系統(tǒng)發(fā)現(xiàn)有兩個(gè)地方有問(wèn)題,C:\WINDOWS\system32\LogFiles文件有6G,還有一個(gè)就是Symantec隔離病毒的地 方,到網(wǎng)上找了下,最大可能性是我們的虛擬主機(jī)的所有日志都寫(xiě)在這里,并且沒(méi)人知道寫(xiě)在這里,郁悶,在IIS里看了下,還真是這么回事,日志天天都在長(zhǎng), 當(dāng)時(shí)公司訂單很多也沒(méi)人關(guān)注這個(gè),當(dāng)時(shí)清理了一下,系統(tǒng)正常,回到公司后把IIS日志改到別的盤(pán)了。 解決方案:不過(guò)這不是最終解決方法呀,一個(gè)虛擬主機(jī)幾百個(gè)站點(diǎn)呢,有的站點(diǎn)一天就能產(chǎn)生幾百M(fèi)的日志文件,還得及時(shí)清理。 與是有了兩種解決方案: 1.每天清理前60天的日志 2.過(guò)段時(shí)間清理一下60天前的日志。 不過(guò)哪種方法都得采用技術(shù)處理,人工去刪除 的話除非你很專(zhuān)業(yè),可以查找60天前的日志文件來(lái)刪除,不過(guò)即便你技術(shù)很好,這種方法也是很費(fèi)時(shí)的,最好的方法是:使用DOS批處理或腳本來(lái)實(shí)現(xiàn),可使用到的腳本主要是vbs與js. 在下邊的解決方案里有幾種方法大家可以選擇適合自己的,他們的總的設(shè)計(jì)思路是這樣的: IIS日志文件的格式是:ex年月日.log 比如:ex071116.log IIS日志文件存儲(chǔ)位置:默認(rèn)情況下是在:%windir%\system32\LogFiles ,如果您使用的是專(zhuān)業(yè)的IIS管理軟件,里面一般會(huì)讓你設(shè)置相應(yīng)日志目錄 IIS日志清理CMD版:跟 據(jù)當(dāng)前時(shí)間計(jì)算出前N天的日期,比如今天是:2007-11-16,前60天的日期就是2007-9-16(程序可以自動(dòng)識(shí)別30天或31天或潤(rùn)月),然 后再處理成20070916這樣的格式,然后再組合成ex070916.log這樣的IIS日志文件格式,這樣一來(lái)我們就得到的要清理的日志文件名然后, 我們?cè)偈褂胐el /s /f d:\iislog\ex070916.log 來(lái)清除日志所在文件夾目錄及子目錄下的所有這個(gè)文件名的文件了,從而清除志,但這個(gè)僅僅是清除一天的日志,所以我們還得把這個(gè)批處理加到計(jì)劃任務(wù)里,讓它 每天定時(shí)執(zhí)行,這樣一來(lái),所有的計(jì)算機(jī)的日志問(wèn)題我們就可以不用管了。 IIS日志清理VBS版:VBS版理論是沒(méi)有iis版快,因?yàn)樗要借助腳本驅(qū)動(dòng),而不像cmd版直接使用dos系統(tǒng)的批處理功能快(猜的),VBS畢竟是高級(jí)語(yǔ)言,處理日期的能力用一句話就實(shí)現(xiàn)了,而CMD版得寫(xiě)半頁(yè)。IIS日志清理VBS版的 實(shí)現(xiàn)用VBS遍歷IIS日志所在目錄下的所有文件,及文件夾,然后取文件名組合成日期型的,然后當(dāng)前日期-這個(gè)日期,看看是不是超過(guò)了設(shè)定的天數(shù),超過(guò)的 話delete,這種思路有個(gè)好處就是一次可以清除N天前的所有記錄,而不是只是一天的,他可以你CMD版日志清理一樣,把這個(gè)腳本寫(xiě)到計(jì)劃任務(wù)里,天天 運(yùn)行,也可以過(guò)一段時(shí)間手動(dòng)運(yùn)行一次。這個(gè)代碼明顯比IIS日志清理CMD版少了。 IIS日志清理JS版:這個(gè)版其實(shí)與IIS日志清理VBS版差不了多少,思路都是一樣的,只是使用的腳本語(yǔ)言不一樣而已,還有就是調(diào)用時(shí)的兩個(gè)參數(shù)里的每一個(gè)參數(shù):目錄,這個(gè)目錄得寫(xiě)成:D:\\iislog,以前都用vbs還當(dāng)主要腳本,這次主要是要學(xué)C#了,聽(tīng)說(shuō)這兩種語(yǔ)言都差不多,正好也練習(xí)下,也沒(méi)花多少時(shí)間。 IIS日志清理WSH版:WSH版其實(shí)是最簡(jiǎn)單的,因?yàn)樗募苫潭群芨,操作過(guò)程是這樣的:使用vbs或js生成要處理的文件的文件名,然后再使用WScript.Shell執(zhí)行cmd命令來(lái)處理,利用了IIS日志清理CMD版及IIS日志清理VBS版的 優(yōu)點(diǎn),這個(gè)也是一次只能處理一天的日志,當(dāng)然您也可以把它改成處理多天的日志。正因?yàn)閃SH集成化程度高,可以執(zhí)行很多操作,所以黑客們都很喜歡這個(gè),用 的最多的也就是WScript.Shell,所以一般安全意識(shí)比較高的服務(wù)器提供商都會(huì)把這個(gè)組件給禁用掉,這樣一來(lái),這個(gè)最好用的功能就變成了最不能使 用的,通用性最差的了。 實(shí)例代碼: IIS日志清理CMD版代碼(DelIISLog.cmd): @echo off title Made by www.yongfa365.com ::設(shè)置當(dāng)前日期前多少天或后多少天 set/a beforedays=-3 ::設(shè)置目錄所在位置 set dir="F:\log\" ::當(dāng)前日期轉(zhuǎn)換為天數(shù)并進(jìn)行計(jì)算 call :Date2Day %date:~0,10% days set/a days=%days%%beforedays% call :Day2Date %days% lastdate ::計(jì)算完畢,生成想要的字符組合 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 '調(diào)用方法: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 '得到該目錄下所有的文件的集合 '第一步處理當(dāng)前目錄下的所有文件 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 '第二步處理當(dāng)前目錄下的所有目錄,進(jìn)行遞歸調(diào)用 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 //調(diào)用方法: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); //得到該目錄下所有的文件的集合 //第一步處理當(dāng)前目錄下的所有文件 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日志文件,如果是的話直接刪除 } //第二步處理當(dāng)前目錄下的所有目錄,進(jìn)行遞歸調(diào)用 for (; !Folders.atEnd(); Folders.moveNext()) { DelIISLog(Folders.item(),KeepDays); } } //調(diào)用函數(shù),比如:"F:\\log",5 或 "C:\\windows\\system32\\LogFiles",5 DelIISLog("D:\\IISLogTest",2); IIS日志清理WSH版代碼(DelIISLog.wsf): <job id="IIS日志清理WSH版代碼(DelIISLog.wsf) Made by www.yongfa365.com"> <script language="vbscript"> '作者:柳永法(yongfa365)'Blog '修改:2007-11-15 '操作說(shuō)明:此文件只能清除一天的日志,得使用計(jì)劃任務(wù)讓其每天執(zhí)行一次,因?yàn)榉⻊?wù)器上一般都禁用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> 有時(shí)我拿到別人的代碼時(shí)我得寫(xiě)一堆東西來(lái)測(cè)試,現(xiàn)在這個(gè)如果讓您去測(cè)試的話,您不會(huì)直接在服務(wù)器上測(cè)試吧,所以,以下再貼出本人柳永法的測(cè)試腳本,主要是在D盤(pán)生成一個(gè)測(cè)試文件夾,及一些IIS測(cè)試日志文件, IIS日志清理之IIS日志生成系統(tǒng)(CreateIISLog.vbs): 'IIS日志清理之IIS日志生成系統(tǒng)(CreateIISLog.vbs) Made by www.yongfa365.com '創(chuàng)建文件夾 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 '創(chuàng)建文件 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 后記:這個(gè)方法不僅可以用在IIS日志處理方面,還可以用在處理Serv-U的日志處理,前提條件是Serv-U的日志文件的格式也得設(shè)成像IIS日志這樣的格式ex071115.log。 本文出自:億恩科技【prubsntakaful.com】 服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |