PowerShell ile IIS Log Analizi ve Trafik Raporlama Otomasyonu

PowerShell ile IIS Log Analizi ve Trafik Raporlama Otomasyonu
Yazı Özetini Göster

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ı

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-Credential veya 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.

Bir Yorum Yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Benzer Yazılar