Script automatisé pour compresser les journaux IIS ?
-
09-06-2019 - |
Question
J'aimerais écrire un script/lot qui regroupera mes journaux IIS quotidiens et les compressera mois par mois.
ex080801.log qui est au format exaammjj.enregistrer
ex080801.log - ex080831.log est compressé et les fichiers journaux sont supprimés.
La raison pour laquelle nous faisons cela est que sur un site lourd, un fichier journal pour une journée peut faire entre 500 Mo et 1 Go, nous les compressons donc, ce qui les compresse à 98 % et vidons le vrai fichier journal.Nous utilisons webtrend pour analyser les fichiers journaux et il est capable de lire un fichier zip.
Quelqu'un a-t-il des idées sur la façon de créer un script ou serait-il prêt à partager du code ?
La solution
Vous aurez besoin d'un outil de ligne de commande pour compresser les fichiers.je recommande 7 fermetures éclair qui est gratuit et facile à utiliser.La version autonome en ligne de commande (7za.exe) est le choix le plus portable.
Voici un fichier batch de deux lignes qui compresserait les fichiers journaux et les supprimerait ensuite :
7za.exe a -tzip ex%1-logs.zip %2\ex%1*.log
del %2\ex%1*.log
Le premier paramètre est l'année et le mois à 4 chiffres, et le deuxième paramètre est le chemin d'accès au répertoire contenant vos journaux.Par exemple: ziplogs.bat 0808 c:\logs
Il est possible d'être plus élaboré (c.-à-d.en recherchant les noms de fichiers pour déterminer les mois à archiver).Vous voudrez peut-être vérifier Windows FINDSTR commande pour rechercher du texte d’entrée avec des expressions régulières.
Autres conseils
Voici mon script qui adapte essentiellement celui de David et compresse les journaux du mois dernier, les déplace et supprime les fichiers journaux d'origine.cela peut également être adapté aux journaux Apache.Le seul problème est que vous devrez peut-être modifier les commandes de remplacement si votre fonction de date DOS affiche la date de la semaine.Vous devrez également installer 7-zip.
Vous pouvez également télécharger IISlogslite, mais il compresse le fichier de chaque jour en un seul fichier zip, ce que je n'ai pas trouvé utile.Il existe un vbscript flottant sur le Web qui fait la même chose.
------------------------------------------------------------------------------------- @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
Nous utilisons un script comme celui-ci.Gzip est du projet cygwin.Je suis sûr que vous pouvez modifier la syntaxe pour utiliser un outil zip à la place.L'argument "skip" est le nombre de fichiers à ne pas archiver - nous conservons 11 jours dans le répertoire "actuel".
@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
Vous pouvez récupérer le package d'utilitaires de ligne de commande à partir de DotNetZip pour obtenir des outils pour créer des zips à partir de scripts.Il existe un joli petit outil appelé Zipit.exe qui s'exécute sur la ligne de commande, ajoute des fichiers ou des répertoires aux fichiers zip.C'est rapide, efficace.
Une meilleure option pourrait être de simplement effectuer la compression depuis 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()
Fonction zip empruntée à http://blogs.msdn.com/daiken/archive/2007/02/12/compress-files-with-windows-powershell-then-package-a-windows-vista-sidebar-gadget.aspx
Voici la réponse PowerShell qui fait des merveilles :
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)
}
Nous utilisons ce script PowerShell : http://gallery.technet.microsoft.com/scriptcenter/31db73b4-746c-4d33-a0aa-7a79006317e6
Il utilise 7-zip et vérifie les fichiers avant de les supprimer
Regex fera l'affaire...créez un script perl/python/php pour faire le travail à votre place.
Je suis presque sûr que le fichier batch Windows ne peut pas faire d'expression régulière.