The purpose of this script is to clean-up the log files folder and keep it at a manageable size.
- Log files older than 7 days will be compressed into ZIP format.
- ZIP files older than 30 days will be deleted.
If ran locally, the script can use the native windows compression tools, but I wanted it to run as a scheduled task. Without using 7-Zip, the script would create the ZIP file, but would never copy the file into the ZIP. 7-Zip is able to accomplish this for me. If it's installed, the script will favor 7-Zip over native tools (update path if you didn't use 32-bit version). I believe this is due to the fact that the copy method in the native compression is ran as a separate task. As a scheduled task, it is never spawned. This leaves a 1kb ZIP file in place.
After running script the first time, you should find in your "C:\inetpub\logs\LogFiles\W3SVC1\" folder, the following items.
- ZIPs containing logs over 7 days old.
- The original log files that are in those ZIPs.
Second run:
- ZIPs over 30 days deleted.
- Logs over 7 days with existing ZIP over 1kb deleted.
If I take out the support for native compression, I can safely have the script delete the old log files after compression. Until then, the script will always leave the old log files until a later run. To accommodate this, I've scheduled the script to run both Sunday and Monday.
<#
.SYNOPSIS
Compress then purge old IIS logs
.DESCRIPTION
Looks for Log files over a certain date.
- Compress files that are over a certain date to ZIP format.
- Delete ZIP files that exceed longer date.
Uses 7ZIP if installed - needs it if running as a scheduled task.
Download: http://7-zip.org/
#>
#variables for folder management
#Folder path to where the IIS logs reside.
$FolderPath = "C:\inetpub\logs\LogFiles\W3SVC1\"
#LOGS older than this date (-7 days ago) will be compressed.
$CompressLogsDate = (Get-Date).AddDays(-7)
#ZIPs older than this date (-30 days ago) will be deleted.
$OldestZIPDate = (Get-Date).AddDays(-30)
#Create ZIP scripts
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
}
}
if (!(Test-Path $FolderPath)) {
write-host "no log folder found at $folderpath"
break
}
#Check to see if 7Zip installed.
$7ZipPath = "${Env:ProgramFiles(x86)}"+"\7-Zip\7z.exe" #32-bit path
#$7ZipPath = "$Env:ProgramFiles\7-Zip\7z.exe" #64-bit path
$Use7Zip = (test-path $7ZipPath)
#Delete ZIPs over a specific date
$ZipPath = $FolderPath +"*.zip"
$RemoveZips = Get-ChildItem $ZipPath |?{$_.lastwritetime -lt $OldestZIPDate}
if ($RemoveZips) { #Delete ZIP files older than $OldestZIPDate.
ForEach ($zip in $RemoveZips) {
Remove-Item $zip.VersionInfo.FileName.tostring()
}
}
#Find Logs that are older than specific date.
$LogPath = $FolderPath +"*.log"
$Oldlogs = Get-ChildItem $LogPath |?{$_.lastwritetime -lt $CompressLogsDate}
if ($Oldlogs) { #Process old log files.
ForEach ($Log in $Oldlogs) {
$LogFileStr = $Log.VersionInfo.FileName.tostring()
$TempZipName = $LogFileStr.replace(".log",".zip")
if (!(Test-Path $tempZipName)) { #Create a new ZIP if one doesn't exist
if ($Use7Zip ) {
#Use 7Zip if using a scheduled task.
set-alias sz $7ZipPath
sz a -tzip $TempZipName $LogFileStr
} else {
#Found this method doesn't work as a scheduled task. This only works if ran interactively.
New-zip $tempZipName
Get-Item $LogFileStr | add-zip $tempZipName
}
} else {
$newZipFile = Get-Item $TempZipName
$CreatedTodayBool = $newZipFile.creationtime -gt (get-date).addhours(-1)
if ($newZipFile.length -gt 1kb) {
#Delete original LOG file it ZIP is larger than creation size.
if (Test-Path $log) {Remove-Item $Log}
} else {
#Make sure not deleting zips created in last hour. Might still be compressing files.
if (!$CreatedTodayBool) {
#Delete ZIP files that are only 1KB in size.
Remove-Item $tempZipName
}
}
}
}
}
No comments:
Post a Comment