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 ?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top