Frage

Ich möchte ein Skript/einen Stapel schreiben, der meine täglichen IIS-Protokolle bündelt und nach Monaten komprimiert.

ex080801.log im Format exjjmmtt.Protokoll

ex080801.log – ex080831.log wird komprimiert und die Protokolldateien gelöscht.

Der Grund dafür ist, dass auf einer umfangreichen Website eine Protokolldatei für einen Tag 500 MB bis 1 GB groß sein kann. Daher komprimieren wir sie, wodurch sie um 98 % komprimiert werden, und sichern die eigentliche Protokolldatei.Wir verwenden Webtrend zur Analyse der Protokolldateien und können diese in eine ZIP-Datei einlesen.

Hat jemand eine Idee, wie man das per Skript schreibt, oder wäre er bereit, etwas Code mitzuteilen?

War es hilfreich?

Lösung

Zum Komprimieren der Dateien benötigen Sie ein Befehlszeilentool.Ich empfehle 7-Reißverschluss das kostenlos und einfach zu bedienen ist.Die eigenständige Befehlszeilenversion (7za.exe) ist die portabelste Wahl.

Hier ist eine zweizeilige Batchdatei, die die Protokolldateien komprimiert und anschließend löscht:

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

Der erste Parameter ist die vierstellige Jahres- und Monatsangabe und der zweite Parameter ist der Pfad zum Verzeichnis, das Ihre Protokolle enthält.Zum Beispiel: ziplogs.bat 0808 c:\logs

Es ist möglich, detaillierter vorzugehen (z. B.Durchsuchen der Dateinamen, um zu bestimmen, welche Monate archiviert werden sollen).Vielleicht möchten Sie sich Windows ansehen FINDSTR Befehl zum Durchsuchen von Eingabetext mit regulären Ausdrücken.

Andere Tipps

Hier ist mein Skript, das im Grunde das von David anpasst und die Protokolle des letzten Monats komprimiert, verschiebt und die ursprünglichen Protokolldateien löscht.Dies kann auch für Apache-Protokolle angepasst werden.Das einzige Problem dabei ist, dass Sie möglicherweise die Ersetzungsbefehle bearbeiten müssen, wenn Ihre DOS-Datumsfunktion das Wochendatum ausgibt.Sie müssen außerdem 7-zip installieren.

Sie können auch IISlogslite herunterladen, aber es komprimiert die Datei jedes Tages in eine einzige ZIP-Datei, was ich nicht nützlich fand.Es gibt ein VBScript im Internet, das 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

Wir verwenden ein Skript wie das folgende.Gzip stammt aus dem Cygwin-Projekt.Ich bin sicher, Sie könnten die Syntax ändern, um stattdessen ein Zip-Tool zu verwenden.Das Argument „skip“ ist die Anzahl der Dateien, 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

Sie können das Paket mit den Befehlszeilendienstprogrammen unter herunterladen DotNetZip um Tools zum Erstellen von Zips aus Skripten zu erhalten.Es gibt ein nettes kleines Tool namens Zipit.exe, das auf der Befehlszeile ausgeführt wird und Dateien oder Verzeichnisse zu ZIP-Dateien hinzufügt.Es ist schnell und effizient.

Eine bessere Option könnte darin bestehen, das Komprimieren einfach in PowerShell durchzuführen.

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

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

Wir verwenden dieses Powershell-Skript: http://gallery.technet.microsoft.com/scriptcenter/31db73b4-746c-4d33-a0aa-7a79006317e6

Es verwendet 7-zip und überprüft die Dateien, bevor sie gelöscht werden

Regex wird den Zweck erfüllen ...Erstellen Sie ein Perl/Python/PHP-Skript, das die Arbeit für Sie erledigt.
Ich bin mir ziemlich sicher, dass die Windows-Batchdatei keinen regulären Ausdruck ausführen kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top