压缩IIS日志的自动化脚本?

Posted

技术标签:

【中文标题】压缩IIS日志的自动化脚本?【英文标题】:Automated script to zip IIS logs? 【发布时间】:2010-09-06 23:13:57 【问题描述】:

我想编写一个脚本/批处理,将我的每日 IIS 日志打包并按月压缩。

ex080801.log,格式为exyymmdd.log

ex080801.log - ex080831.log 被压缩并删除日志文件。

我们这样做的原因是因为在一个繁重的网站上,一天的日志文件可能是 500mb 到 1gb,所以我们将它们压缩起来,将它们压缩 98% 并转储真实的日志文件。我们使用 webtrend 来分析日志文件,它能够读入一个 zip 文件。

是否有人对如何编写脚本有任何想法或愿意分享一些代码?

【问题讨论】:

【参考方案1】:

正则表达式可以解决问题...创建一个 perl/python/php 脚本来为您完成这项工作.. 我很确定 Windows 批处理文件不能做正则表达式。

【讨论】:

【参考方案2】:

您需要一个命令行工具来压缩文件。我推荐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 命令。

【讨论】:

【参考方案3】:

我们使用如下脚本。 Gzip 来自 cygwin 项目。我确定您可以修改语法以使用 zip 工具。 “skip”参数是不归档的文件数——我们在“当前”目录中保留 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

【讨论】:

【参考方案4】:

这是我的脚本,它基本上改编了 David 的脚本,压缩了上个月的日志,移动它们并删除了原始日志文件。这也可以适用于 Apache 日志。 唯一的问题是,如果您的 DOS 日期函数输出星期几,您可能需要编辑替换命令。 您还需要安装 7-zip。

您也可以下载 IISlogslite,但它会将每天的文件压缩成一个 zip 文件,我觉得这没什么用。有一个浮动在网络上的 vbscript 做同样的事情。

-------------------------------------------------- ---------------------------------- @echo on :: 名称 - iislogzip.bat :: 描述 - 服务器日志文件管理器 :: :: 历史 :: 日期授权变更 :: 2008 年 8 月 27 日 David Crow 原创(在堆栈溢出中找到) :: 2008 年 10 月 15 日 AIMackenzie 精简命令 :: ================================================= ======== :: 设置变量和参数 :: ================================================= ======== :: 生成日期和时间变量 设置月份=%DATE:~3,2% 设置年份=%DATE:~8,2% ::获取上个月并检查边缘条件 设置 /a lastmonth=%month%-1 if %lastmonth% equ 0 设置 /a year=%year%-1 如果 %lastmonth% equ 0 设置 lastmonth=12 if %lastmonth% lss 10 设置 lastmonth=0%lastmonth% 设置 yymm=%year%%lastmonth% 设置 logpath="C:\WINDOWS\system32\LogFiles" 设置 zippath="C:\Program Files\7-Zip\7z.exe" 设置 arcpath="C:\WINDOWS\system32\LogFiles\WUDF" :: ================================================= ======== :: 更改为日志文件路径 :: ================================================= ======== cd /D %logpath% :: ================================================= ======== :: 压缩上个月的 IIS 日志文件,将压缩文件移动到存档 :: 然后删除旧日志 :: ================================================= ======== %zippath% a -tzip ex%yymm%-logs.zip %logpath%\ex%yymm%*.log 移动 "%logpath%\*.zip" "%arcpath%" del %logpath%\ex%yymm%*.log

【讨论】:

我猜日期格式只是随着 Windows 的较新版本而改变,但为了在 Windows 7 中正确获取月份和日期,我必须将这些行更改为:set month=%DATE:~4 ,2% 设定年份=%DATE:~12,2% 我认为日期设置取决于服务器/区域设置,因此您可能需要对其进行编辑。如果有人有通用时间功能,我将不胜感激!【参考方案5】:

您可以从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()

【讨论】:

【参考方案6】:

从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)

【讨论】:

【参考方案7】:

我们使用这个 powershell 脚本:http://gallery.technet.microsoft.com/scriptcenter/31db73b4-746c-4d33-a0aa-7a79006317e6

它使用 7-zip 并在删除文件之前验证文件

【讨论】:

以上是关于压缩IIS日志的自动化脚本?的主要内容,如果未能解决你的问题,请参考以下文章

使用windows脚本编写自动压缩文件、删除源文件的脚本?

使用Shell脚本批量给tomcat日志打包压缩并清理

如何实现linux自动压缩指定日志

nginx--基于crond定时服务+shell脚本实现nginx日志自动清理及备份

基于IIS的OA网站监控及自动重启脚本

Server2008R2 IIS配置“.PAC”自动配置脚本代理