108 lines
3.1 KiB
PowerShell
108 lines
3.1 KiB
PowerShell
<#
|
|
.SYNOPSIS
|
|
Rotates and cleans up old log files.
|
|
|
|
.DESCRIPTION
|
|
Removes transcript and log files older than the specified retention period.
|
|
Designed to run as a scheduled task daily.
|
|
|
|
.PARAMETER RetentionDays
|
|
Number of days to retain log files. Default is 30.
|
|
|
|
.PARAMETER LogPath
|
|
Path to the logs directory. Default is C:\ClaudeTools\Logs.
|
|
|
|
.PARAMETER WhatIf
|
|
Shows what would be deleted without actually deleting.
|
|
|
|
.EXAMPLE
|
|
.\Invoke-LogRotation.ps1
|
|
Removes logs older than 30 days.
|
|
|
|
.EXAMPLE
|
|
.\Invoke-LogRotation.ps1 -RetentionDays 14 -WhatIf
|
|
Shows what would be deleted with 14-day retention.
|
|
|
|
.NOTES
|
|
Author: ClaudeTools Automation
|
|
Version: 1.0
|
|
#>
|
|
|
|
[CmdletBinding(SupportsShouldProcess)]
|
|
param(
|
|
[Parameter(Mandatory=$false)]
|
|
[int]$RetentionDays = 30,
|
|
|
|
[Parameter(Mandatory=$false)]
|
|
[string]$LogPath = "C:\ClaudeTools\Logs"
|
|
)
|
|
|
|
$rotationLog = Join-Path $LogPath "rotation.log"
|
|
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
|
|
|
|
function Write-Log {
|
|
param([string]$Message)
|
|
$logEntry = "[$timestamp] $Message"
|
|
Add-Content -Path $rotationLog -Value $logEntry
|
|
Write-Host $logEntry
|
|
}
|
|
|
|
Write-Log "=== Log Rotation Started ==="
|
|
Write-Log "Retention Period: $RetentionDays days"
|
|
Write-Log "Log Path: $LogPath"
|
|
|
|
$cutoffDate = (Get-Date).AddDays(-$RetentionDays)
|
|
$totalDeleted = 0
|
|
$totalSizeFreed = 0
|
|
|
|
# Find and delete old files
|
|
$oldFiles = Get-ChildItem -Path $LogPath -Recurse -File |
|
|
Where-Object { $_.LastWriteTime -lt $cutoffDate -and $_.Name -ne "rotation.log" }
|
|
|
|
$fileCount = ($oldFiles | Measure-Object).Count
|
|
Write-Log "Found $fileCount files older than $RetentionDays days"
|
|
|
|
foreach ($file in $oldFiles) {
|
|
$fileSize = $file.Length
|
|
$filePath = $file.FullName
|
|
|
|
if ($PSCmdlet.ShouldProcess($filePath, "Delete")) {
|
|
try {
|
|
Remove-Item $filePath -Force
|
|
$totalDeleted++
|
|
$totalSizeFreed += $fileSize
|
|
Write-Log "Deleted: $filePath ($([math]::Round($fileSize/1KB, 2)) KB)"
|
|
} catch {
|
|
Write-Log "ERROR deleting $filePath : $_"
|
|
}
|
|
} else {
|
|
Write-Log "WhatIf: Would delete $filePath ($([math]::Round($fileSize/1KB, 2)) KB)"
|
|
}
|
|
}
|
|
|
|
# Delete empty subdirectories
|
|
$emptyDirs = Get-ChildItem -Path $LogPath -Directory -Recurse |
|
|
Where-Object { (Get-ChildItem $_.FullName -Force).Count -eq 0 }
|
|
|
|
foreach ($dir in $emptyDirs) {
|
|
if ($PSCmdlet.ShouldProcess($dir.FullName, "Remove empty directory")) {
|
|
try {
|
|
Remove-Item $dir.FullName -Force
|
|
Write-Log "Removed empty directory: $($dir.FullName)"
|
|
} catch {
|
|
Write-Log "ERROR removing directory $($dir.FullName) : $_"
|
|
}
|
|
}
|
|
}
|
|
|
|
# Summary
|
|
$sizeMB = [math]::Round($totalSizeFreed / 1MB, 2)
|
|
Write-Log "=== Rotation Complete ==="
|
|
Write-Log "Files Deleted: $totalDeleted"
|
|
Write-Log "Space Freed: $sizeMB MB"
|
|
|
|
# Show current disk usage
|
|
$currentSize = (Get-ChildItem -Path $LogPath -Recurse -File | Measure-Object -Property Length -Sum).Sum
|
|
$currentSizeMB = [math]::Round($currentSize / 1MB, 2)
|
|
Write-Log "Current Log Directory Size: $currentSizeMB MB"
|