Automatisiertes Skript zum Komprimieren von IIS-Protokollen?
-
09-06-2019 - |
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?
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.