2008-08-27 16 views
15

Ich möchte ein Skript/Batch schreiben, das meine täglichen IIS-Logs zusammenfasst und sie nach Monat zippen lässt.Automatisiertes Skript zum Zippen von IIS-Protokollen?

ex080801.log, die im Format von ex ist YYMMDD .log

ex080801.log - ex080831.log wird gezippt und die Protokolldateien gelöscht.

Der Grund, warum wir dies tun ist, weil auf einer schweren Website eine Protokolldatei für einen Tag 500 MB bis 1 GB sein könnte, so dass wir sie zippen, was sie um 98% komprimiert und die echte Protokolldatei ausgibt. Wir verwenden webtrend, um die Protokolldateien zu analysieren, und können in eine Zip-Datei einlesen.

Hat jemand irgendwelche Ideen, wie man dies skript oder wäre bereit, etwas Code zu teilen?

Antwort

12

Sie benötigen ein Befehlszeilentool, um die Dateien zu komprimieren. Ich empfehle 7-Zip, die frei und einfach zu bedienen ist. Die eigenständige Befehlszeilenversion (7za.exe) ist die portabelste Option.

Hier ist eine zweizeilige Batchdatei, die die Log-Dateien zip würde und löschen Sie sie anschließend:

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

Der erste Parameter die 4-stellige Jahr-und-Monat ist, und der zweite Parameter ist der Pfad zu das Verzeichnis mit Ihren Protokollen. Zum Beispiel: ziplogs.bat 0808 c:\logs

Es ist möglich, komplizierter zu werden (d. H. Die Dateinamen nach den zu archivierenden Monaten zu durchsuchen). Sie können den Windows-Befehl FINDSTR zum Suchen von Eingabetext mit regulären Ausdrücken verwenden.

0

Regex den Trick ... ein Perl/Python/PHP-Skript erstellen die Arbeit für Sie tun ..
Ich bin mir ziemlich sicher, dass Windows-Batch-Datei kann nicht regex tun.

2

Wir verwenden ein Skript wie das folgende. Gzip stammt aus dem Cygwin-Projekt. Ich bin sicher, dass Sie die Syntax ändern könnten, um stattdessen ein Zip-Tool zu verwenden. Das Argument "Überspringen" gibt die Anzahl der Dateien an, die nicht archiviert werden sollen - wir behalten 11 Tage im "aktuellen" Verzeichnis.

@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 
6

Hier ist mein Skript, das im Grunde passt Davids, und reißt letzten Monat Protokolle, verschiebt sie und löscht die ursprünglichen Protokolldateien. Dies kann auch für Apache-Logs angepasst werden. Das einzige Problem dabei ist, dass Sie möglicherweise die Ersetzungsbefehle bearbeiten müssen, wenn Ihre DOS-Datumsfunktion das Datum der Woche ausgibt. Sie müssen auch 7-Zip installieren.

Sie können auch IISlogslite herunterladen, aber es komprimiert jeden Tag Datei in eine einzige Zip-Datei, die ich nicht nützlich fand. Es gibt ein Vbscript, das über das Web schwebt und das Gleiche tut.

 
------------------------------------------------------------------------------------- 
@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 
+2

Ich rate das Datumsformat nur geändert mit neueren Versionen von Windows, aber um den Monat und den Tag korrekt in Windows 7 zu bekommen, musste ich diese Zeilen zu ändern: gesetzt Monat =% DATE: ~ 4,2% Jahr =% DATE: ~ 12, 2% –

+1

Ich denke, die Datumseinstellungen sind abhängig vom Server/Gebietsschema, daher müssen Sie sie möglicherweise bearbeiten. Wenn jemand eine universelle Zeitfunktion hat, wäre ich dankbar! – alimack

1

Sie die Befehlszeilenprogramme Paket von DotNetZip Tools zu erhalten, greifen Reißverschlüsse von Skripten zu erstellen. Es gibt ein nettes kleines Tool namens Zipit.exe, das auf der Kommandozeile läuft und Dateien oder Verzeichnisse zu Zip-Dateien hinzufügt. Es ist schnell und effizient.

Eine bessere Option könnte sein, einfach das Zippen von innerhalb PowerShell zu machen.

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() 
1

Borrowed Zip-Funktion von http://blogs.msdn.com/daiken/archive/2007/02/12/compress-files-with-windows-powershell-then-package-a-windows-vista-sidebar-gadget.aspx

Hier ist Powershell-Antwort, die Wunder wirkt:

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