自动化脚本来压缩IIS日志?
我想编写一个脚本/批处理,将我的每日IIS日志捆绑在一起,并按月将其压缩。
ex080801.log,其格式为exyymmdd.log
ex080801.log ex080831.log被压缩,日志文件被删除。
我们这样做的原因是,在一个繁重的站点上,一天的日志文件可能为500mb至1gb,因此我们将其压缩,将其压缩98%,然后转储实际的日志文件。我们使用webtrend分析日志文件,并且能够读取zip文件。
是否有人对如何编写此脚本有任何想法,还是愿意共享一些代码?
解决方案
回答
正则表达式将解决问题...创建一个perl / python / php脚本来为我们完成这项工作。
我很确定Windows批处理文件不能执行正则表达式。
回答
我们将需要一个命令行工具来压缩文件。我建议我们免费使用7-Zip。独立的命令行版本(7za.exe)是最可移植的选择。
这是两行的批处理文件,它将压缩日志文件并随后将其删除:
7za.exe a -tzip ex%1-logs.zip %2\ex%1*.log del %2\ex%1*.log
第一个参数是4位数字的年份和月份,第二个参数是包含日志的目录的路径。例如:ziplogs.bat 0808 c:\ logs
可能会更加详尽(例如,搜索文件名以确定要归档的月份)。我们可能想签出Windows FINDSTR命令,以使用正则表达式搜索输入文本。
回答
我们使用如下脚本。 Gzip来自cygwin项目。我确定我们可以将语法修改为使用zip工具。 "跳过"参数是未归档的文件数-我们在"当前"目录中保留11天。
@echo off setlocal For /f "skip=11 delims=/" %%a in ('Dir D:\logs\W3SVC1\*.log /B /O:-N /T:C')do move "D:\logs\W3SVC1\%%a" "D:\logs\W3SVC1\old\%%a" d: cd "\logs\W3SVC1\old" gzip -n *.log Endlocal exit
回答
这是我的脚本,基本上适应了David的脚本,并压缩了上个月的日志,将其移动并删除了原始日志文件。这也可以适用于Apache日志。
唯一的问题是,如果DOS日期功能输出星期几,则可能需要编辑替换命令。
我们还需要安装7-zip。
我们也可以下载IISlogslite,但是它将每天的文件压缩成一个单独的zip文件,我认为这没有用。网络上有一个vbscript可以执行相同的操作。
------------------------------------------------------------------------------------- @echo on :: Name - iislogzip.bat :: Description - Server Log File Manager :: :: History :: Date Authory Change :: 27-Aug-2008 David Crow Original (found on stack overflow) :: 15-Oct-2008 AIMackenzie Slimmed down commands :: ======================================================== :: setup variables and parameters :: ======================================================== :: generate date and time variables set month=%DATE:~3,2% set year=%DATE:~8,2% ::Get last month and check edge conditions set /a lastmonth=%month%-1 if %lastmonth% equ 0 set /a year=%year%-1 if %lastmonth% equ 0 set lastmonth=12 if %lastmonth% lss 10 set lastmonth=0%lastmonth% set yymm=%year%%lastmonth% set logpath="C:\WINDOWS\system32\LogFiles" set zippath="C:\Program Files-Zipz.exe" set arcpath="C:\WINDOWS\system32\LogFiles\WUDF" :: ======================================================== :: Change to log file path :: ======================================================== cd /D %logpath% :: ======================================================== :: zip last months IIS log files, move zipped file to archive :: then delete old logs :: ======================================================== %zippath% a -tzip ex%yymm%-logs.zip %logpath%\ex%yymm%*.log move "%logpath%\*.zip" "%arcpath%" del %logpath%\ex%yymm%*.log
回答
我们可以从DotNetZip获取命令行实用程序包,以获取从脚本创建zip的工具。有一个名为Zipit.exe的不错的小工具,可以在命令行上运行,将文件或者目录添加到zip文件中。快速,高效。
更好的选择可能是仅在PowerShell中进行压缩。
function ZipUp-Files ( $directory ) { $children = get-childitem -path $directory foreach ($o in $children) { if ($o.Name -ne "TestResults" -and $o.Name -ne "obj" -and $o.Name -ne "bin" -and $o.Name -ne "tfs" -and $o.Name -ne "notused" -and $o.Name -ne "Release") { if ($o.PSIsContainer) { ZipUp-Files ( $o.FullName ) } else { if ($o.Name -ne ".tfs-ignore" -and !$o.Name.EndsWith(".cache") -and !$o.Name.EndsWith(".zip") ) { Write-output $o.FullName $e= $zipfile.AddFile($o.FullName) } } } } } [System.Reflection.Assembly]::LoadFrom("c:\\bin\Ionic.Zip.dll"); $zipfile = new-object Ionic.Zip.ZipFile("zipsrc.zip"); ZipUp-Files "DotNetZip" $zipfile.Save()
回答
从http://blogs.msdn.com/daiken/archive/2007/02/12/compress-files-with-windows-powershell-then-package-a-windows-vista-sidebar-gadget.aspx借来的zip函数
这是神奇的Powershell答案:
param([string]$Path = $(read-host "Enter the path")) function New-Zip { param([string]$zipfilename) set-content $zipfilename ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) (dir $zipfilename).IsReadOnly = $false } function Add-Zip { param([string]$zipfilename) if(-not (test-path($zipfilename))) { set-content $zipfilename ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) (dir $zipfilename).IsReadOnly = $false } $shellApplication = new-object -com shell.application $zipPackage = $shellApplication.NameSpace($zipfilename) foreach($file in $input) { $zipPackage.CopyHere($file.FullName) Start-sleep -milliseconds 500 } } $FilesToZip = dir $Path -recurse -include *.log foreach ($file in $FilesToZip) { New-Zip $file.BaseName dir $($file.directoryname+"\"+$file.name) | Add-zip $($file.directoryname+"$($file.basename).zip") del $($file.directoryname+"\"+$file.name) }