PowerShell ile IIS Log Analizi ve Trafik Raporlama Otomasyonu
PowerShell ile IIS Log Analizi ve Trafik Raporlama Otomasyonu
IIS (Internet Information Services) web sunucularında üretilen W3C logları; ziyaretçi trafiğini, en çok istek yapılan URL’leri, yanıt sürelerini ve hata kodlarını görselleştirmek için altın değerindedir. Bu makalede IIS loglarının PowerShell ile nasıl parseleneceğini, özet raporların nasıl üretileceğini ve günlük/haftalık otomatik e-posta raporu akışının nasıl kurulacağını adım adım anlatıyoruz.
- IIS Loglarının Konumu ve Formatı
- PowerShell ile W3C Loglarını Okumak
- Temel Trafik Metriği Özetleri
- Hata Analizi ve Kötü İsteklerin Yakalanması
- Bot/Agent Filtreleme (Opsiyonel)
- Coğrafi ve Saatlik Trafik Isısı (IP + Zaman)
- HTML/CSV Rapor Üretimi
- Raporu E-posta ile Gönderme
- Günlük Otomasyon (Task Scheduler)
- Performans ve Boyut Yönetimi
- Güvenlik ve Gizlilik
- Sonuç
IIS Loglarının Konumu ve Formatı
Varsayılan log klasörü: C:\inetpub\logs\LogFiles\W3SVC*. W3C formatında satırlar boşlukla ayrılır; #Fields: başlığı, kolon adlarını belirtir (ör. date time c-ip cs-method cs-uri-stem sc-status time-taken).
PowerShell ile W3C Loglarını Okumak
W3C loglarını doğru okumak için önce #Fields: satırını yakalayın, ardından veriyi bu başlıklarla ConvertFrom-Csv kullanarak içeri aktarın.
# Tek dosyayı parse eden fonksiyon
function Parse-IISLog {
param([string]$Path)
$header = (Select-String -Path $Path -Pattern '^#Fields:' -SimpleMatch |
Select-Object -Last 1).Line -replace '^#Fields:\s*',''
$cols = $header -split '\s+'
Get-Content -Path $Path | Where-Object {$_ -notmatch '^#'} |
ConvertFrom-Csv -Delimiter ' ' -Header $cols
}
# Klasördeki tüm günlükleri birleşik okuyun
$logRoot = 'C:\inetpub\logs\LogFiles'
$files = Get-ChildItem -Path $logRoot -Recurse -Filter *.log
$data = foreach($f in $files){ Parse-IISLog -Path $f.FullName }
# Tarih sütunu üret (date + time)
$data | Add-Member -NotePropertyName dt -NotePropertyValue `
([datetime]::ParseExact(("$($_.date) $($_.time)"), 'yyyy-MM-dd HH:mm:ss', $null)) -Force
Temel Trafik Metriği Özetleri
Aşağıdaki blok, 24 saatlik pencerede en çok görüntülenen ilk 20 URL, durum kodu dağılımı ve ortalama yanıtlama süresini (ms) üretir.
$since = (Get-Date).AddDays(-1)
$window = $data | Where-Object {$_.dt -ge $since}
# Top 20 URL
$topUrls = $window | Group-Object cs-uri-stem |
Sort-Object Count -Descending | Select-Object -First 20
# HTTP durum kodu dağılımı
$byStatus = $window | Group-Object sc-status |
Sort-Object Count -Descending
# Ortalama yanıt süresi
$avgTime = ($window.'time-taken' | Measure-Object -Average).Average
$summary = [pscustomobject]@{
'Pencere'='Son 24 Saat'
'Toplam İstek' = $window.Count
'Ortalama Yanıt (ms)' = [int]$avgTime
'Benzersiz IP' = ($window.'c-ip' | Select-Object -Unique).Count
}
$summary
Hata Analizi ve Kötü İsteklerin Yakalanması
5xx sunucu hataları ve 4xx istemci hataları için en problemli URL ve IP’leri tespit edin.
$errors = $window | Where-Object {[int]$_.{'sc-status'} -ge 400}
$hotErrUrls = $errors | Group-Object cs-uri-stem | Sort-Object Count -Desc | Select -First 10
$hotErrIps = $errors | Group-Object 'c-ip' | Sort-Object Count -Desc | Select -First 10
Bot/Agent Filtreleme (Opsiyonel)
Certain botları rapordan hariç tutmak için kullanıcı aracısı filtreleyin.
$bots = 'bot','spider','crawler'
$human = $window | Where-Object { $ua = $_.'cs(User-Agent)'; -not ($bots | ForEach-Object { $ua -match $_ }) }
Coğrafi ve Saatlik Trafik Isısı (IP + Zaman)
IP coğrafyasını haritalamak için ücretli/ücretsiz GeoIP veritabanları kullanılabilir. Saatlik istek dağılımı ise ham veriden kolayca çıkarılır.
$hourly = $window | Group-Object { $_.dt.ToString('yyyy-MM-dd HH:00') } |
Sort-Object Name |
Select-Object @{n='Saat';e={$_.Name}}, @{n='İstek';e={$_.Count}}
HTML/CSV Rapor Üretimi
Yönetici dostu bir çıktı için HTML tablo + CSV ekleri hazırlayın.
$reportDir = 'C:\Reports\IIS' New-Item -ItemType Directory -Force -Path $reportDir | Out-Null $topUrls | Export-Csv "$reportDir\top-urls.csv" -NoTypeInformation -Encoding UTF8 $byStatus | Export-Csv "$reportDir\status.csv" -NoTypeInformation -Encoding UTF8 $hourly | Export-Csv "$reportDir\hourly.csv" -NoTypeInformation -Encoding UTF8 # Basit HTML $html = @" <h2>IIS Trafik Özeti (Son 24 Saat)</h2> <p>Toplam İstek: $($summary.'Toplam İstek') – Ortalama Yanıt: $($summary.'Ortalama Yanıt (ms)') ms – Benzersiz IP: $($summary.'Benzersiz IP')</p> <h3>Durum Kodu Dağılımı</h3> $( ($byStatus | Select-Object Name,Count | ConvertTo-Html -Fragment) -replace '<table>','<table border="1" cellspacing="0" cellpadding="4">' ) <h3>En Çok Görüntülenen 20 URL</h3> $( ($topUrls | Select-Object Name,Count | ConvertTo-Html -Fragment) -replace '<table>','<table border="1" cellspacing="0" cellpadding="4">' ) "@ $htmlPath = "$reportDir\iis-traffic-report.html" $html | Out-File -FilePath $htmlPath -Encoding UTF8
Raporu E-posta ile Gönderme
Basit SMTP ile HTML raporu gönderin (kurum içi SMTP kullanın). Send-MailMessage modern sunumlarda yerini alternatif modüllere bıraksa da, kapalı devre ortamlarda hâlâ pratik bir seçenektir.
$to='it-ops@example.com'; $from='iis-reports@example.com'; $smtp='smtp.example.com' Send-MailMessage -To $to -From $from -Subject "IIS Trafik Raporu (Son 24 Saat)" ` -SmtpServer $smtp -BodyAsHtml -Body (Get-Content $htmlPath -Raw) ` -Attachments "$reportDir\top-urls.csv","$reportDir\status.csv","$reportDir\hourly.csv"
Günlük Otomasyon (Task Scheduler)
PowerShell betiğinizi tek bir .ps1 dosyasına toplayın ve her sabah 08:00’de çalışacak bir görev oluşturun.
$action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument '-NoProfile -ExecutionPolicy Bypass -File "C:\Scripts\IIS-Report.ps1"' $trigger = New-ScheduledTaskTrigger -Daily -At 08:00 Register-ScheduledTask -TaskName 'IIS Daily Traffic Report' -Action $action -Trigger $trigger -Description 'IIS loglarından günlük trafik raporu gönderir' -User 'DOMAIN\svc_iisreport' -RunLevel Highest
Performans ve Boyut Yönetimi
- Sıkıştırma: Log klasöründe Compress-Archive ile arşivleyin, 30 günü geçeni temizleyin.
- Paralel okuma: Çok dosya için
ForEach-Object -Parallel(PowerShell 7+) kullanın. - LogParser2 (opsiyonel): SQL benzeri sorgularla çok hızlı özetler alabilirsiniz.
Güvenlik ve Gizlilik
- Log dosyalarına sadece işletim ve güvenlik ekipleri erişebilmeli (NTFS ACL).
- Kişisel veri olabilecek IP/UA kayıtlarını dış paylaşımda maskeleyin/anomize edin.
- SMTP kimlik bilgilerini
Get-Credentialveya Güvenli Dize (DPAPI/SecretManagement) ile saklayın.
Sonuç
PowerShell ile IIS log analizi; ham veriyi okunabilir içgörüye dönüştürerek operasyon ekibine hızlı aksiyon alma imkânı sunar. Doğru parselleme, anlamlı metrikler (URL, durum kodu, yanıt süresi) ve Task Scheduler ile otomatik e-posta akışı kurulduğunda; tıkanmalar, hatalı dağıtımlar veya anormal trafik dalgaları erkenden yakalanır. Kurumsal ölçekte, bu akışı merkezi SIEM veya APM sistemleriyle entegre ederek görünürlüğü daha da artırabilirsiniz.