Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <#
- .SYNOPSIS
- IISLogsCleanup.ps1 - IIS Log File Cleanup Script
- .DESCRIPTION
- Creates zip archives of IIS log files older than the first day
- of the previous month.
- .PARAMETER Logpath
- The IIS log directory to cleanup.
- .PARAMETER ArchivePath
- The path to a location where zip files are moved to, for example
- a central log repository stored on a NAS.
- .EXAMPLE
- .\IISLogsCleanup.ps1 -Logpath "D:\IIS Logs\W3SVC1"
- .EXAMPLE
- .\IISLogsCleanup.ps1 -Logpath "D:\IIS Logs\W3SVC1" -ArchivePath "\\nas01\archives\iislogs"
- .LINK
- http://exchangeserverpro.com/powershell-script-iis-logs-cleanup
- .NOTES
- Written By: Paul Cunningham
- Website: http://exchangeserverpro.com
- Twitter: http://twitter.com/exchservpro
- Additional Credits:
- Filip Kasaj - http://ficility.net/2013/02/25/ps-2-0-remove-and-compress-iis-logs-automatically/
- Change Log
- V1.00, 7/04/2014, Initial version
- #>
- [CmdletBinding()]
- param (
- [Parameter( Mandatory=$true)]
- [string]$Logpath,
- [Parameter( Mandatory=$false)]
- [string]$ArchivePath
- )
- #-------------------------------------------------
- # Variables
- #-------------------------------------------------
- $sleepinterval = 10
- $computername = $env:computername
- $date = Get-Date
- $currentmonth = ($date.ToString("MM/yy"))
- $previousmonth = ($date.AddMonths(-1).ToString("MM/yy"))
- [string]$firstdayofpreviousmonth = Get-Date "01/$previousmonth"
- $myDir = Split-Path -Parent $MyInvocation.MyCommand.Path
- $output = "$myDir\IISLogsCleanup.log"
- #...................................
- # Logfile Strings
- #...................................
- $logstring0 = "====================================="
- $logstring1 = " IIS Log File Cleanup Script"
- #-------------------------------------------------
- # Functions
- #-------------------------------------------------
- #This function is used to write the log file for the script
- Function Write-Logfile()
- {
- param( $logentry )
- $timestamp = Get-Date -DisplayHint Time
- "$timestamp $logentry" | Out-File $output -Append
- }
- #-------------------------------------------------
- # Script
- #-------------------------------------------------
- #Log file is overwritten each time the script is run to avoid
- #very large log files from growing over time
- $timestamp = Get-Date -DisplayHint Time
- "$timestamp $logstring0" | Out-File $output
- Write-Logfile $logstring1
- Write-Logfile " $date"
- Write-Logfile $logstring0
- #Check whether IIS Logs path exists, exit if it does not
- if ((Test-Path $Logpath) -ne $true)
- {
- $tmpstring = "Log path $logpath not found"
- Write-Warning $tmpstring
- Write-Logfile $tmpstring
- EXIT
- }
- $tmpstring = "Current Month: $currentmonth"
- Write-Host $tmpstring
- Write-Logfile $tmpstring
- $tmpstring = "Previous Month: $previousmonth"
- Write-Host $tmpstring
- Write-Logfile $tmpstring
- $tmpstring = "First Day of Previous Month: $firstdayofpreviousmonth"
- Write-Host $tmpstring
- Write-Logfile $tmpstring
- #Fetch list of log files older than 1st day of previous month
- $logstoremove = Get-ChildItem -Path "$($Logpath)\*.*" -Include *.log | Where {$_.LastWriteTime -lt $firstdayofpreviousmonth -and $_.PSIsContainer -eq $false}
- if ($($logstoremove.Count) -eq $null)
- {
- $logcount = 0
- }
- else
- {
- $logcount = $($logstoremove.Count)
- }
- $tmpstring = "Found $logcount logs earlier than $firstdayofpreviousmonth"
- Write-Host $tmpstring
- Write-Logfile $tmpstring
- #Init a hashtable to store list of log files
- $hashtable = @{}
- #Add each logfile to hashtable
- foreach ($logfile in $logstoremove)
- {
- $zipdate = $logfile.LastWriteTime.ToString("yyyy-MM")
- $hashtable.Add($($logfile.FullName),"$zipdate")
- }
- #Calculate unique yyyy-MM dates from logfiles in hashtable
- $hashtable = $hashtable.GetEnumerator() | Sort Value
- $dates = @($hashtable | Group -Property:Value | Select Name)
- #For each yyyy-MM date add those logfiles to a zip file
- foreach ($date in $dates)
- {
- $zipfilename = "$Logpath\$computername-$($date.Name).zip"
- 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)
- $zipfiles = $hashtable | Where {$_.Value -eq "$($date.Name)"}
- $tmpstring = "Zip file name is $zipfilename and will contain $($zipfiles.Count) files"
- Write-Host $tmpstring
- Write-Logfile $tmpstring
- foreach($file in $zipfiles)
- {
- $fn = $file.key.ToString()
- $tmpstring = "Adding $fn to $zipfilename"
- Write-Host $tmpstring
- Write-Logfile $tmpstring
- $zipPackage.CopyHere($fn,16)
- #This sleep interval helps avoids file lock/conflict issues. May need to increase if larger
- #log files are taking longer to add to the zip file.
- Start-sleep -s $sleepinterval
- }
- #Compare count of log files on disk to count of log files in zip file
- $zippedcount = ($zipPackage.Items()).Count
- $tmpstring = "Zipped count: $zippedcount"
- Write-Host $tmpstring
- Write-Logfile $tmpstring
- $tmpstring = "Files: $($zipfiles.Count)"
- Write-Host $tmpstring
- Write-Logfile $tmpstring
- #If counts match it is safe to delete the log files from disk
- if ($zippedcount -eq $($zipfiles.Count))
- {
- $tmpstring = "Zipped file count matches log file count, safe to delete log files"
- Write-Host $tmpstring
- Write-Logfile $tmpstring
- foreach($file in $zipfiles)
- {
- $fn = $file.key.ToString()
- Remove-Item $fn
- }
- #If archive path was specified move zip file to archive path
- if ($ArchivePath)
- {
- #Check whether archive path is accessible
- if ((Test-Path $ArchivePath) -ne $true)
- {
- $tmpstring = "Log path $archivepath not found or inaccessible"
- Write-Warning $tmpstring
- Write-Logfile $tmpstring
- }
- else
- {
- #Check if subfolder of archive path exists
- if ((Test-Path $ArchivePath\$computername) -ne $true)
- {
- try
- {
- #Create subfolder based on server name
- New-Item -Path $ArchivePath\$computername -ItemType Directory -ErrorAction STOP
- }
- catch
- {
- #Subfolder creation failed
- $tmpstring = "Unable to create $computername subfolder in $archivepath"
- Write-Host $tmpstring
- Write-Logfile $tmpstring
- $tmpstring = $_.Exception.Message
- Write-Warning $tmpstring
- Write-Logfile $tmpstring
- }
- }
- try
- {
- #Move the zip file
- Move-Item $zipfilename -Destination $ArchivePath\$computername -ErrorAction STOP
- $tmpstring = "$zipfilename was moved to $archivepath\$computername"
- Write-Host $tmpstring
- Write-Logfile $tmpstring
- }
- catch
- {
- #Move failed, log the error
- $tmpstring = "Unable to move $zipfilename to $ArchivePath\$computername"
- Write-Host $tmpstring
- Write-Logfile $tmpstring
- Write-Warning $_.Exception.Message
- Write-Logfile $_.Exception.Message
- }
- }
- }
- }
- else
- {
- $tmpstring = "Zipped file count does not match log file count, not safe to delete log files"
- Write-Host $tmpstring
- Write-Logfile $tmpstring
- }
- }
- #Finished
- $tmpstring = "Finished"
- Write-Host $tmpstring
- Write-Logfile $tmpstring
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement