Managing IIS logs using programmatically using PowerShell script
Managing IIS logs using programmatically using PowerShell script
Managing IIS logs is a vital task for any administrator which can be automated using a PowerShell script. Logs can quickly build up on high traffic sites which in turn can quickly fill up drives causing other potential issues.
The below script can be used to purge script to a defined time range. In the case of the example 30 days of logs are kept but this can easily be changed by updating the $maxDaystoKeep variable. The all you need to do is a Windows Scheduled task to execute daily.
Import-Module WebAdministration
$maxDaystoKeep = -30 # number of days to keep IIS logs
$outputPath = "D:\Netops\"
$outputFile = "IIS_log_cleanup.log"
$logname = $outputPath + $outputFile
$lognameback = $outputPath + $outputFile + '.bak' + (get-date).ToString(‘hhmmssMMddyyyy’)
$logpurgesize = '10mb' # set the log file size to purge at
$logfilepurgedays = '14' # set the number of days to keep log files
$purgelimit = (Get-Date).AddDays(-$logfilepurgedays)
if(!(Test-Path $outputPath)){New-Item -ItemType Directory -Path $outputPath}
if(Test-Path $logname){$logsize = (get-item $logname).LastWriteTime}
# Manage existing logs
if(Test-Path $logname){
$logsize = (get-item $logname).length/$logpurgesize
Write-Output "$(Get-date) log size is $logsize " | Out-file $logname -append
if ((get-item $logname).length -gt $logpurgesize){
Write-Output "$(Get-date) $logname is greater than 20MB, rolling over" | Out-file $logname -append
Write-Output "$(Get-date) rename $logname -to $lognameback" | Out-file $logname -append
rename-item -path $logname -newname $lognameback
}
Write-Output "$(Get-date) deleting logs files older than $logfilepurgedays days" | Out-file $logname -append
Get-Item -Path $outputPath\$outputFile* -Force | Where-Object { !$_.PSIsContainer -and $_.LastWriteTime -lt $purgelimit } | Remove-Item -Force
}
#starting log
Write-Output "$(Get-date) Starting logging" | Out-file $logname -append
$checkIISinstalled = Get-WindowsFeature -Name Web-Server
if($checkIISinstalled.Installed -eq $True )
{
Write-output "$(Get-date) IIS is insalled, proceeding" | Add-Content $logname
foreach($WebSite in $(get-website))
{
$logFile="$($Website.logFile.directory)\w3svc$($website.id)".replace("%SystemDrive%",$env:SystemDrive)
Write-output "$(Get-date) Site and directory to purge - $($WebSite.name) [$logfile]" | Add-Content $logname
$itemsToDelete = dir $logFile -Recurse -File *.log | Where LastWriteTime -lt ((get-date).AddDays($maxDaystoKeep))
Write-output "$(Get-date) Items to delete $itemsToDelete " | Add-Content $logname
if ($itemsToDelete.Count -gt 0)
{
ForEach ($item in $itemsToDelete)
{
# "$($item.BaseName) is older than $((get-date).AddDays($maxDaystoKeep)) and will be deleted" | Add-Content $logname
$FileAndPath = $logfile + '\' + $item
Write-output "$(Get-date) Deleting $FileAndPath" | Add-Content $logname
# write-host $FileAndPath
Get-Item $FileAndPath | Remove-Item -Verbose
}
}
else
{
Write-output "$(Get-date) No items to be delete today" | Add-Content $logname
}
Write-output "$(Get-date) Sleep" | Add-Content $logname
start-sleep -Seconds 5
}
}
else
{
Write-output "$(Get-date) IIS is not insalled, nothing to do !" | Add-Content $logname
}