Logfiles roteren met Powershell

Posted on

In een typische shared hosting omgeving krijg je binnen de map van de gebruiker een locatie waar log bestanden worden weggeschreven.   Als hoster heb je dan een groot aantal (liefst Knipogende emoticon) mappen met in elk van die mappen een map “logs” waarin al snel (alles samen) duizenden log files staan.  Het volgende Powershell script overloopt alle mappen (zeg maar alle klanten) en neemt alle log bestanden die minstens 7 dagen oud zijn, steekt die in een zip bestandje met als naam JAAR-WEEKINJAAR.ZIP en verwijdert die file vervolgens.   Het script is makkelijk aanpasbaar om dit bvb. maandelijks te doen ipv wekelijks.

$TargetFolder = "c:Sites"
$Now = Get-Date
$ArchiveFrom = $Now.AddDays(-7)

$mappen = get-childitem -Path $TargetFolder
          | Where {$_.psIsContainer -eq $true}
foreach ($map in $mappen)
{
  $mapuse = "$TargetFolder$maplog"
  if (Test-Path ($mapuse))
  {
    $logbestanden = dir -Recurse $mapuse | Where {($_.LastWriteTime -le "$ArchiveFrom")
            -and ($_.extension -eq ".log")}
    $bestandsnaam = get-date -uFormat %Y-%V
    $zipfile = "$mapuse$bestandsnaam.zip"
    echo $zipfile
    set-content "$zipfile" ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))

    (dir $zipfile).IsReadOnly = $false
    $shellApplication = new-object -com shell.application
    $zipPackage = $shellApplication.NameSpace($zipfile)
    foreach ($logfile in $logbestanden)
    {
            $zipPackage.CopyHere($logfile.FullName)
            Start-sleep -milliseconds 1000
            Remove-Item $file | out-null

    }
  }
}

Bij vragen of opmerkingen, hoor ik graag van u !