Nettoyage des logs Exchange

  Diskshadow
  Add volume d:
  REM (optional, add one line for each additional drive to include) Add volume X:
  Begin Backup
  Create
  End Backup

Sur les serveur Exchange, il n'y a pas de purge automatique des logs. Il est nécessaire de le faire manuellement de façon périodique.

Nous proposons le script suivant :

ExchangeCleanup.ps1
# Cleanup logs older than the set of days in numbers
$days = 30
 
# Path of the logs that you like to cleanup
$IISLogPath = "C:\inetpub\logs\LogFiles\"
$ExchangeLoggingPath = "C:\Program Files\Microsoft\Exchange Server\V15\Logging\"
$ETLLoggingPath = "C:\Program Files\Microsoft\Exchange Server\V15\Bin\Search\Ceres\Diagnostics\ETLTraces\"
$ETLLoggingPath2 = "C:\Program Files\Microsoft\Exchange Server\V15\Bin\Search\Ceres\Diagnostics\Logs\"
 
Function CleanLogfiles($TargetFolder) {
    Write-Host -Debug -ForegroundColor Yellow -BackgroundColor Cyan $TargetFolder
 
    if (Test-Path $TargetFolder) {
        $Now = Get-Date
        $LastWrite = $Now.AddDays(-$days)
        $Files = Get-ChildItem $TargetFolder -Recurse | Where-Object { $_.Name -like "*.log" -or $_.Name -like "*.blg" -or $_.Name -like "*.etl" } | Where-Object { $_.lastWriteTime -le "$lastwrite" } | Select-Object FullName
        foreach ($File in $Files) {
            $FullFileName = $File.FullName  
            Write-Host "Deleting file $FullFileName" -ForegroundColor "yellow"; 
            Remove-Item $FullFileName -ErrorAction SilentlyContinue | out-null
        }
    }
    Else {
        Write-Host "The folder $TargetFolder doesn't exist! Check the folder path!" -ForegroundColor "red"
    }
}
 
 
If (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))
{
    Start-Process powershell.exe "-File",('"{0}"' -f $MyInvocation.MyCommand.Path),"-ConfFile ",('"{0}"' -f $ConfFile) -Verb RunAs
}Else{
  Write-Verbose "I AM (Ps>)ROOT"
    #gci ‘C:\Program Files\Microsoft\Exchange Server\V15\Logging’ -Directory | gci -Include ‘*.log’,’*.blg’ -Recurse | ? LastWriteTime -lt (Get-Date).AddDays(-7) | Remove-Item -Recurse -Force -Confirm:$false
    #gci ‘C:\Inetpub\logs’ -Directory | gci -Include ‘*.log’,’*.blg’ -Recurse | ? LastWriteTime -lt (Get-Date).AddDays(-14) | Remove-Item -Recurse -Force -Confirm:$false
    CleanLogfiles($IISLogPath)
    CleanLogfiles($ExchangeLoggingPath)
    CleanLogfiles($ETLLoggingPath)
    CleanLogfiles($ETLLoggingPath2)
}

Les dossiers à nettoyer étant C:\Program Files\Microsoft\Exchange Server\V15\Logging pour les logs purement Exchange et C:\Inetpub\logs pour les logs IIS, notamment ceux du webmail.

Pour nettoyer les logs, il faut des privilèges administrateur. Les dossiers de logs ne sont pas accessible sans élévation de privilège.

Il est possible de planifier le nettoyage avec des taches planifiés, exécuté en tant qu'utilisateur Système. Voilà un script d'installation pour les tâches planifiés. Ces commandes doivent être exécuté en administrateur. Vous pouvez faire un clique droit sur le menu démarrer pour ouvrir un powershell en administrateur ou bien taper “powershell” puis cliquer sur “Executer en tant qu'administrateur”.

Une fois dans la fenêtre PowerShell, vous pouvez copier / coller l'ensemble des commandes ci-dessous.

Import-Module ScheduledTasks
$A = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "gci 'C:\Program Files\Microsoft\Exchange Server\V15\Logging' -Directory | gci -Include '*.log','*.blg' -Recurse | ? LastWriteTime -lt (Get-Date).AddDays(-7) | Remove-Item -Recurse -Force -Confirm:$false"
$T = New-ScheduledTaskTrigger -Daily -At 9pm
$P = New-ScheduledTaskPrincipal "NT AUTHORITY\SYSTEM" -RunLevel Highest -LogonType ServiceAccount
$S = New-ScheduledTaskSettingsSet
$D = New-ScheduledTask -Action $A -Principal $P -Trigger $T -Settings $S -Description "Cleanup Exchange logs"
Register-ScheduledTask -TaskName "EXCH Purge exchange logs" -InputObject $D
 
$A = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "gci 'C:\Inetpub\logs' -Directory | gci -Include '*.log','*.blg' -Recurse | ? LastWriteTime -lt (Get-Date).AddDays(-14) | Remove-Item -Recurse -Force -Confirm:$false"
$T = New-ScheduledTaskTrigger -Daily -At 10pm
$D = New-ScheduledTask -Action $A -Principal $P -Trigger $T -Settings $S -Description "Cleanup IIS logs"
Register-ScheduledTask -TaskName "EXCH Purge IIS" -InputObject $D

Ces commandes vont créer deux tâches planifiés : EXCH Purge IIS et EXCH Purge exchange logs qui nettoieront les logs respectivement à 22h et 21h. Tous les logs de plus de 14 jours seront effacés.