Domanda

Mi piacerebbe scrivere uno script/batch che raggrupperà i miei registri IIS giornalieri e li comprimerà per mese.

ex080801.log che è nel formato exaammgg.tronco d'albero

ex080801.log - ex080831.log viene compresso e i file di registro vengono eliminati.

Il motivo per cui lo facciamo è perché su un sito pesante un file di registro per un giorno potrebbe essere compreso tra 500 MB e 1 GB, quindi li comprimiamo, comprimendoli del 98% e scarichiamo il file di registro reale.Usiamo webtrend per analizzare i file di registro ed è in grado di leggere un file zip.

Qualcuno ha qualche idea su come scrivere questo script o sarebbe disposto a condividere del codice?

È stato utile?

Soluzione

Avrai bisogno di uno strumento da riga di comando per comprimere i file.raccomando 7-zip che è gratuito e facile da usare.La versione da riga di comando autonoma (7za.exe) è la scelta più portabile.

Ecco un file batch di due righe che comprimerebbe i file di registro e li eliminerebbe in seguito:

7za.exe a -tzip ex%1-logs.zip %2\ex%1*.log
del %2\ex%1*.log

Il primo parametro è l'anno e il mese a 4 cifre e il secondo parametro è il percorso della directory contenente i registri.Per esempio: ziplogs.bat 0808 c:\logs

È possibile essere più elaborati (ad es.cercando i nomi dei file per determinare quali mesi archiviare).Potresti voler dare un'occhiata a Windows TROVASTR comando per cercare il testo di input con espressioni regolari.

Altri suggerimenti

Ecco il mio script che sostanzialmente adatta quello di David e comprime i registri del mese scorso, li sposta ed elimina i file di registro originali.questo può essere adattato anche per i log di Apache.L'unico problema è che potresti dover modificare i comandi di sostituzione, se la tua funzione di data DOS restituisce la data della settimana.Dovrai anche installare 7-zip.

Puoi anche scaricare IISlogslite ma comprime il file di ogni giorno in un unico file zip che non ho trovato utile.C'è un vbscript fluttuante sul web che fa la stessa cosa.

-------------------------------------------------------------------------------------
@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\7-Zip\7z.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

Usiamo uno script come il seguente.Gzip proviene dal progetto Cygwin.Sono sicuro che potresti modificare la sintassi per utilizzare invece uno strumento zip.L'argomento "salta" è il numero di file da non archiviare: manteniamo 11 giorni nella directory "corrente".

@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

Puoi prendere il pacchetto delle utilità della riga di comando da DotNetZip per ottenere strumenti per creare zip dagli script.C'è un piccolo strumento carino chiamato Zipit.exe che viene eseguito sulla riga di comando, aggiunge file o directory ai file zip.È veloce, efficiente.

Un'opzione migliore potrebbe essere quella di eseguire semplicemente la compressione da 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()

Funzione zip presa in prestito da http://blogs.msdn.com/daiken/archive/2007/02/12/compress-files-with-windows-powershell-then-package-a-windows-vista-sidebar-gadget.aspx

Ecco la risposta di PowerShell che fa miracoli:

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

Usiamo questo script PowerShell: http://gallery.technet.microsoft.com/scriptcenter/31db73b4-746c-4d33-a0aa-7a79006317e6

Utilizza 7-zip e verifica i file prima di eliminarli

Regex farà il trucco...crea uno script perl/python/php che faccia il lavoro per te..
Sono abbastanza sicuro che il file batch di Windows non possa eseguire regex.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top