Sistem/DevOps•6 dk okuma

C Sürücüsünü Dolduran IIS ve Güvenlik Duvarı W3C Loglarını 30 Gün Sonra ZIP'leyerek Arşivleyen Bakım Betiği

Web ve ERP sunucularında C:\\inetpub\\logs\\LogFiles klasörünün terabaytlarca şişip sunucuyu çökertmesini engelleyen, eski logları ZIP ile sıkıştırıp arşivleyen ve 180 gün sonra temizleyen PowerShell rotasyon motoru.

AE

Ahmet Ertekin

10 May 2022

C Sürücüsünü Dolduran IIS ve Güvenlik Duvarı W3C Loglarını 30 Gün Sonra ZIP'leyerek Arşivleyen Bakım Betiği

C Sürücüsünü Dolduran IIS ve Güvenlik Duvarı W3C Loglarını 30 Gün Sonra ZIP'leyerek Arşivleyen Bakım Betiği

Bir sistem yöneticisinin meslek hayatında en az bir kez yaşadığı klasik kriz: "Web sunucusu veya Exchange OWA aniden 500 Internal Server Error vermeye başladı, RDP ile bağlandık, C: sürücüsünde 0 bayt boş alan kalmış!" Diski neyin doldurduğuna baktığınızda suçlu daima aynıdır: C:\inetpub\logs\LogFiles\W3SVC1 klasöründe yıllardır biriken yüz binlerce adet ham metin formatındaki W3C Web Logları. Bu logları silmek yasal olarak (5651 Sayılı Kanun) yasaktır; ancak ham halde bırakmak sunucuyu öldürür. Çözüm: PowerShell ile Otonom Log Rotasyonu ve ZIP Arşivleme.

1. Mantık ve Yaşam Döngüsü (Lifecycle)

  • Son 30 Gün: Ham metin (.log) olarak kalır (Canlı analiz ve sorun giderme için).
  • 30 - 180 Gün Arası: Metin dosyaları %90 oranında sıkıştırılarak aylık .ZIP arşivlerine dönüştürülür ve ikincil depolama diskine (D:\LogsArchive) taşınır.
  • 180 Günden Eski: Yasal saklama süresi dolan veya soğuk arşive aktarılan loglar kalıcı olarak silinir.

2. Üretim Seviyesinde PowerShell Log Rotasyon Betiği

$LogPath = "C:\inetpub\logs\LogFiles\W3SVC1"
$ArchivePath = "D:\Archive_IIS_Logs"
$DaysToCompress = 30
$DaysToDelete = 180

if (-not (Test-Path $ArchivePath)) { New-Item -ItemType Directory -Path $ArchivePath -Force }

# 1. 30 Günden Eski Log Dosyalarını Bul ve Sıkıştır
$OldLogs = Get-ChildItem -Path $LogPath -Filter "*.log" | Where-Object {
    $_.LastWriteTime -lt (Get-Date).AddDays(-$DaysToCompress)
}

foreach ($file in $OldLogs) {
    $MonthFolder = Join-Path $ArchivePath $file.LastWriteTime.ToString("yyyy-MM")
    if (-not (Test-Path $MonthFolder)) { New-Item -ItemType Directory -Path $MonthFolder -Force }
    
    $ZipFile = Join-Path $MonthFolder "$($file.BaseName).zip"
    
    # PowerShell dahili .NET sıkıştırmasıyla ZIP yapma
    Compress-Archive -Path $file.FullName -DestinationPath $ZipFile -CompressionLevel Optimal -Force
    
    # Başarıyla sıkıştırıldıysa orijinal ham logu sil (Disk alanı anında açılır!)
    if (Test-Path $ZipFile) {
        Remove-Item $file.FullName -Force
    }
}

# 2. 180 Günden Eski ZIP Arşivlerini Kalıcı Olarak Temizle
Get-ChildItem -Path $ArchivePath -Recurse -Filter "*.zip" | Where-Object {
    $_.LastWriteTime -lt (Get-Date).AddDays(-$DaysToDelete)
} | Remove-Item -Force

Write-Host "Log rotasyonu başarıyla tamamlandı!" -ForegroundColor Green

3. Zamanlanmış Görev (Task Scheduler) Kurulumu

Bu betik her pazar gecesi saat 03:00'te çalışacak şekilde Windows Görev Zamanlayıcısı'na eklenir.

Karşılaşılan Kritik Hatalar ve Çözüm İpuçları

  • Dosya Kullanımda (File in Use) Hatası: IIS o an güncel günün log dosyasına yazmaya devam ettiği için o dosyayı sıkıştıramaz veya silemez. Scriptimiz .LastWriteTime -lt (Get-Date).AddDays(-30) filtresi kullandığı için bugünün açık loguna asla dokunmaz.
  • Sıkıştırma Oranı Mucizesi: Düz metin IIS logları ZIP formatına girdiğinde 100 GB'lık log klasörü yaklaşık 8 GB'a düşer! Diskte %92 oranında devasa bir yer açılır.

Mühendis Notu

C: sistem sürücüsünü daima işletim sistemine adayın. IIS kurarken log kayıt dizinini daha ilk günden C: yerine ayrı bir veri diskine (D:\IIS_Logs) yönlendirmeyi şirket içi kurulum standardı haline getirin.