Windows Server Olay Günlüğü Nedir: Event Viewer Kullanımı

Bir sistem yöneticisi olarak işlerin en karmaşık hale geldiği an, genellikle bir şeylerin sessizce bozulduğu andır. Sunucu yavaşlıyor, uygulama çöküyor ya da kullanıcılar “bir şeyler oldu” diye şikayet ediyor ama kimse tam olarak ne olduğunu bilmiyor. İşte tam bu noktada Windows Server’ın en güçlü silahlarından biri devreye giriyor: Olay Günlüğü (Event Log) ve onu görselleştiren Event Viewer.

Bu yazıda Event Viewer’ı sadece yüzeysel olarak tanıtmayacağım. Gerçek senaryolarla, PowerShell komutlarıyla ve pratik ipuçlarıyla bu aracı tam anlamıyla nasıl kullanacağınızı ele alacağız.

Windows Olay Günlüğü Nasıl Çalışır

Windows işletim sistemi, arka planda sürekli olarak olayları kaydeder. Bu olaylar; sistem başlangıcından uygulama hatalarına, güvenlik ihlali girişimlerinden donanım sorunlarına kadar geniş bir yelpazeyi kapsar. Bu kayıtlar .evtx uzantılı dosyalarda tutulur ve varsayılan olarak C:WindowsSystem32winevtLogs dizininde saklanır.

Olay Günlüğü mimarisi üç temel bileşenden oluşur:

  • Event Provider: Olayı üreten kaynak. Bu bir Windows servisi, uygulama veya kernel bileşeni olabilir.
  • Event Channel: Olayların ayrıştırıldığı mantıksal kanallar. Application, System, Security gibi.
  • Event Consumer: Olayları okuyan araçlar. Event Viewer, PowerShell, SIEM sistemleri vs.

Her olay kaydında şu bilgiler bulunur:

  • Event ID: Olayın benzersiz kimlik numarası
  • Level: Kritiklik seviyesi (Critical, Error, Warning, Information, Verbose)
  • Source: Olayı üreten uygulama veya servis
  • Date/Time: Olayın gerçekleştiği zaman damgası
  • Computer: Olayın gerçekleştiği makine adı
  • User: İlgili kullanıcı hesabı (varsa)

Event Viewer’ı Açmak ve Temel Gezinme

Event Viewer’ı açmanın birkaç yolu var:

# Run diyalogundan (Win + R)
eventvwr.msc

# Komut satırından
eventvwr

# PowerShell'den
Start-Process eventvwr.msc

Arayüz açıldığında sol panelde bir ağaç yapısı görürsünüz. Ana kategoriler şunlardır:

  • Custom Views: Kendi filtrelediğiniz görünümler
  • Windows Logs: Ana sistem günlükleri (Application, Security, Setup, System, Forwarded Events)
  • Applications and Services Logs: Spesifik uygulama ve servis günlükleri
  • Subscriptions: Uzak makinelerden topladığınız olaylar

Kritik Günlük Kanalları

Application Log: IIS, SQL Server, .NET uygulamaları gibi kullanıcı alanında çalışan uygulamaların hataları burada görünür. Bir web uygulaması çöktüğünde ilk bakacağınız yer.

System Log: Windows servisleri, sürücüler ve kernel bileşenlerinin ürettiği olaylar. Mavi ekran (BSOD) sonrası, disk hataları, ağ adaptörü sorunları hep burada.

Security Log: Başarılı ve başarısız oturum açma denemeleri, nesne erişimleri, politika değişiklikleri. Audit politikası aktifse bu log altın madeni.

Setup Log: Windows kurulumu ve güncelleme işlemleri. Bir Windows Update bozuk kurulduysa buraya bakın.

PowerShell ile Olay Günlüğü Sorgulamak

Event Viewer GUI olarak kullanışlı olsa da gerçek güç PowerShell ile gelir. Özellikle çok sayıda sunucuyu yönetiyorsanız veya otomatik izleme kuruyorsanız PowerShell vazgeçilmez.

Get-EventLog ile Temel Sorgular

# Son 20 sistem olayını listele
Get-EventLog -LogName System -Newest 20

# Sadece hata seviyesindeki olayları getir
Get-EventLog -LogName System -EntryType Error -Newest 50

# Belirli bir kaynaktan gelen olayları filtrele
Get-EventLog -LogName System -Source "Service Control Manager" -Newest 30

# Belirli tarih aralığında olayları sorgula
Get-EventLog -LogName Application -After "2024-01-01" -Before "2024-01-31" -EntryType Error

Get-WinEvent ile Gelişmiş Sorgular

Get-WinEvent, Get-EventLog‘dan çok daha güçlü ve modern bir cmdlet’tir. Özellikle Applications and Services Logs kanallarına erişmek için bu kullanılmalıdır:

# Son 1 saatte oluşan kritik ve hata olaylarını getir
$baslangic = (Get-Date).AddHours(-1)
Get-WinEvent -FilterHashtable @{
    LogName = 'System'
    Level = 1,2  # 1=Critical, 2=Error
    StartTime = $baslangic
}

# Event ID'ye göre sorgulama (4625 = başarısız oturum açma)
Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    Id = 4625
    StartTime = (Get-Date).AddDays(-1)
} | Select-Object TimeCreated, Message | Format-List

# Birden fazla log kanalını aynı anda sorgula
Get-WinEvent -FilterHashtable @{
    LogName = 'System','Application'
    Level = 2
    StartTime = (Get-Date).AddHours(-6)
} | Sort-Object TimeCreated -Descending

XPath ile Kompleks Filtreler

Büyük ortamlarda XML tabanlı XPath sorguları çok işe yarar:

# XPath ile gelişmiş filtre - son 2 saatte EventID 7034 (servis beklenmedik şekilde sonlandı)
$xpath = "*[System[EventID=7034 and TimeCreated[timediff(@SystemTime) <= 7200000]]]"
Get-WinEvent -LogName System -FilterXPath $xpath

# Birden fazla Event ID için XPath
$xpath2 = "*[System[(EventID=7034 or EventID=7031 or EventID=7024) and TimeCreated[timediff(@SystemTime) <= 86400000]]]"
Get-WinEvent -LogName System -FilterXPath $xpath2 | Select-Object TimeCreated, Id, Message

Gerçek Dünya Senaryosu 1: Sunucu Gece Kendiliğinden Yeniden Başlıyor

Klasik senaryo: Sabah ofise geliyorsunuz, kullanıcılar “gece sunucu yeniden başladı” diyor. Event Viewer açıyorsunuz ve şunu yapıyorsunuz:

# Beklenmedik kapanma olaylarını bul (Event ID 6008)
Get-WinEvent -FilterHashtable @{
    LogName = 'System'
    Id = 6008
    StartTime = (Get-Date).AddDays(-7)
} | Select-Object TimeCreated, Message | Format-List

# Kernel-Power olaylarını kontrol et (Event ID 41 = dirty shutdown)
Get-WinEvent -FilterHashtable @{
    LogName = 'System'
    ProviderName = 'Microsoft-Windows-Kernel-Power'
    Id = 41
    StartTime = (Get-Date).AddDays(-7)
} | Format-List TimeCreated, Message

Event ID 6008 bulursanız bu beklenmedik kapanma demektir. Enerji kesilmesi, BSOD veya donanım arızası olabilir. Event ID 41 ise sistemin düzgün kapatılmadan kapandığını gösterir.

Ardından kapanma zamanının hemen öncesindeki olaylara bakarsınız:

# Sunucunun kapandığı zamanı bul ve önceki 10 dakikayı incele
$kapanmaZamani = (Get-WinEvent -FilterHashtable @{LogName='System'; Id=6008} -MaxEvents 1).TimeCreated
$aralikBaslangic = $kapanmaZamani.AddMinutes(-10)

Get-WinEvent -FilterHashtable @{
    LogName = 'System'
    StartTime = $aralikBaslangic
    EndTime = $kapanmaZamani
} | Sort-Object TimeCreated | Format-List TimeCreated, Id, Message

Gerçek Dünya Senaryosu 2: Brute Force Saldırısı Tespiti

Security log’u izlemek güvenlik açısından kritik. Özellikle RDP açık sunucularda başarısız oturum açma denemeleri alarm zili çalmalı:

# Son 24 saatte başarısız oturum açma denemelerini say (Event ID 4625)
$sonGun = (Get-Date).AddDays(-1)
$basarisizDeneme = Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    Id = 4625
    StartTime = $sonGun
}

Write-Host "Son 24 saatte başarısız oturum açma sayısı: $($basarisizDeneme.Count)"

# IP adresine göre grupla ve en çok deneyenleri listele
$basarisizDeneme | ForEach-Object {
    $xml = [xml]$_.ToXml()
    $xml.Event.EventData.Data | Where-Object { $_.Name -eq 'IpAddress' } | Select-Object -ExpandProperty '#text'
} | Group-Object | Sort-Object Count -Descending | Select-Object -First 10 Name, Count

Eğer bir IP’den yüzlerce deneme görüyorsanız, bu bir brute force saldırısıdır. Windows Firewall veya bir WAF kuralıyla o IP’yi bloklayabilirsiniz.

Özel Görünümler (Custom Views) Oluşturmak

Event Viewer’da her seferinde filtreleme yapmak zaman kaybı. Custom Views özelliğiyle sık kullandığınız filtreleri kaydedebilirsiniz.

Sol panelde Custom Views üzerine sağ tıklayın, Create Custom View seçin:

  • Logged: Zaman aralığı
  • Event level: Hangi seviyeleri görmek istediğiniz
  • By log veya By source: Hangi kanaldan veya kaynaktan
  • Event IDs: Spesifik event ID’leri (virgülle ayırın, – ile hariç tutun)

Örnek kullanışlı Custom View ayarları:

  • Kritik Sistem Hataları: System + Application log, Level: Critical ve Error
  • Güvenlik Olayları: Security log, ID: 4624, 4625, 4648, 4672
  • Servis Arızaları: System log, Source: Service Control Manager, ID: 7034, 7031, 7023

Bu görünümleri XML olarak da dışa aktarıp başka sunuculara aktarabilirsiniz.

Olay Günlüğü Boyut Yönetimi

Bir süre sonra log dosyaları şişebilir. Her kanalın boyut limiti ve eski kayıtların ne yapılacağı ayarlanabilir:

# Tüm log kanallarını ve boyutlarını listele
Get-WinEvent -ListLog * | Select-Object LogName, FileSize, MaximumSizeInBytes, RecordCount | 
    Where-Object { $_.RecordCount -gt 0 } | 
    Sort-Object FileSize -Descending | 
    Select-Object -First 20 | 
    Format-Table -AutoSize

# Belirli bir log'un boyut limitini artır (Security log'u 500MB yap)
$log = Get-WinEvent -ListLog Security
$log.MaximumSizeInBytes = 524288000  # 500 MB
$log.SaveChanges()

# Log'u temizle (dikkatli kullanın!)
# wevtutil cl Application

Boyut limitine ulaşıldığında ne olacağını da belirleyebilirsiniz:

  • Overwrite events as needed: Eski kayıtların üzerine yaz (varsayılan)
  • Archive the log when full: Dolu olduğunda arşivle, yeni log başlat
  • Do not overwrite events: Dolunca yeni kayıt alma (tehlikeli, dikkat)

Kritik ortamlarda Security log için Archive modunu öneririm. Aksi halde saldırı kanıtları üzerine yazılabilir.

Uzak Sunuculardan Olay Toplama

Onlarca sunucuyu yönetiyorsanız, her birine tek tek bağlanıp log bakmak pratik değil. PowerShell’in gücünü kullanın:

# Uzak sunucudan olay çekme
Get-WinEvent -ComputerName "SUNUCU01" -FilterHashtable @{
    LogName = 'System'
    Level = 1,2
    StartTime = (Get-Date).AddHours(-4)
}

# Birden fazla sunucudan paralel log toplama
$sunucular = @("SUNUCU01", "SUNUCU02", "SUNUCU03", "SUNUCU04")
$hatalar = foreach ($sunucu in $sunucular) {
    try {
        Get-WinEvent -ComputerName $sunucu -FilterHashtable @{
            LogName = 'System','Application'
            Level = 2
            StartTime = (Get-Date).AddHours(-1)
        } -ErrorAction Stop | 
        Select-Object @{N='Sunucu';E={$sunucu}}, TimeCreated, Id, LevelDisplayName, Message
    }
    catch {
        Write-Warning "$sunucu - Bağlantı hatası: $_"
    }
}

# Sonuçları CSV'ye aktar
$hatalar | Export-Csv -Path "C:Raporlarsunucu-hatalari.csv" -Encoding UTF8 -NoTypeInformation
Write-Host "Toplam $($hatalar.Count) hata bulundu ve CSV'ye aktarıldı."

Windows Event Forwarding (WEF) Kurulumu

Merkezi log toplama için WEF harika bir çözüm. Collector sunucuda şunu çalıştırın:

# Collector servisini başlat
winrm quickconfig -quiet
wecutil qc -quiet

# Subscription oluşturma (XML dosyasından)
wecutil cs "C:subscription.xml"

# Mevcut subscription'ları listele
wecutil es

# Subscription durumunu kontrol et
wecutil gr "CriticalEvents"

Önemli Event ID’leri Ezberlemeniz Gerekmez Ama Bunları Bilin

Sık karşılaşacağınız ve ne anlama geldiğini bilmeniz gereken Event ID’ler:

System Log:

  • 7034: Servis beklenmedik şekilde sonlandı
  • 7031: Servis beklenmedik şekilde sonlandı, kurtarma eylemi alındı
  • 7023: Servis bir hatayla sonlandı
  • 6008: Beklenmedik sistem kapanması
  • 41: Kernel-Power, dirty shutdown
  • 1001: Windows Hata Raporlama (BSOD sonrası)

Security Log:

  • 4624: Başarılı oturum açma
  • 4625: Başarısız oturum açma
  • 4648: Açık kimlik bilgileri ile oturum açma girişimi
  • 4672: Özel ayrıcalıklar atandı (admin oturum açması)
  • 4720: Kullanıcı hesabı oluşturuldu
  • 4726: Kullanıcı hesabı silindi
  • 4740: Kullanıcı hesabı kilitlendi

Application Log:

  • 1000: Uygulama çökmesi
  • 1001: Windows Hata Raporlama
  • 1002: Uygulama yanıt vermedi

Log’ları Dışa Aktarmak ve Arşivlemek

# Event Viewer GUI'den dışa aktarma (komut satırı)
wevtutil epl System "C:Backupsystem-$(Get-Date -Format 'yyyyMMdd').evtx"
wevtutil epl Security "C:Backupsecurity-$(Get-Date -Format 'yyyyMMdd').evtx"
wevtutil epl Application "C:Backupapplication-$(Get-Date -Format 'yyyyMMdd').evtx"

# Log'u okunabilir XML formatında dışa aktar
wevtutil qe System /f:XML /c:100 > "C:Backupsystem-son100.xml"

# Haftalık arşiv scripti (Task Scheduler'a ekleyin)
$tarih = Get-Date -Format 'yyyy-MM-dd'
$hedefDizin = "\fileserverLogArsiv$env:COMPUTERNAME$tarih"
New-Item -ItemType Directory -Path $hedefDizin -Force

wevtutil epl System "$hedefDizinSystem.evtx"
wevtutil epl Security "$hedefDizinSecurity.evtx"
wevtutil epl Application "$hedefDizinApplication.evtx"

Write-Host "Arşivleme tamamlandı: $hedefDizin"

Olay Tabanlı Görev Oluşturmak

Event Viewer’ın az bilinen ama çok işe yarayan özelliği: Belirli bir olay tetiklendiğinde otomatik eylem başlatmak.

Örneğin, kritik bir servis çöktüğünde (Event ID 7034) size mail atmasını istiyorsanız:

Event Viewer’da ilgili olayı bulun, sağ tıklayın ve Attach Task to This Event seçin. Sihirbaz size şunları sunacak:

  • Bir program çalıştır (PowerShell script, batch dosyası)
  • Mail gönder (deprecated ama hala çalışır)
  • Mesaj göster

PowerShell ile aynısını Task Scheduler üzerinden de yapabilirsiniz, bu daha esnektir.

Audit Policy: Security Log’u Anlamlı Kılmak

Security log varsayılan olarak çok az şey kaydeder. Audit Policy aktif etmezseniz 4625 olayı bile göremeyebilirsiniz:

# Mevcut audit politikasını kontrol et
auditpol /get /category:*

# Oturum açma olaylarını denetlemeyi aktif et
auditpol /set /subcategory:"Logon" /success:enable /failure:enable

# Hesap yönetimi olaylarını denetle
auditpol /set /subcategory:"User Account Management" /success:enable /failure:enable

# Nesne erişimini denetle
auditpol /set /subcategory:"File System" /success:enable /failure:enable

# Politika değişikliklerini denetle
auditpol /set /subcategory:"Audit Policy Change" /success:enable /failure:enable

Group Policy üzerinden merkezi olarak uygulamak için: Computer Configuration > Windows Settings > Security Settings > Advanced Audit Policy Configuration

Sonuç

Event Viewer ve Windows Olay Günlüğü, bir sistem yöneticisinin en değerli tanılama araçlarından biridir. Ancak bu araç, yüzeysel bilindiğinde anlamsız gürültüden ibaret görünür. Doğru filtreleri, doğru Event ID’leri ve PowerShell’in sorgu gücünü bir araya getirdiğinizde, sunucunuzda tam anlamıyla ne olduğunu görebilirsiniz.

Pratikte şu alışkanlıkları edinmenizi öneririm: Kritik sunucularda Security log boyutunu en az 1 GB yapın, WEF ile merkezi log toplama kurun ve sık karşılaştığınız sorunlar için Custom View’lar oluşturun. Bir sorun patlak verdiğinde saatlerce tahmin yürütmek yerine, birkaç dakika içinde kök nedeni bulabilmek hem size hem de kullanıcılarınıza büyük fayda sağlar.

Son olarak, log yönetimini reaktif değil proaktif bir süreç olarak ele alın. Sorun çıkmadan önce düzenli log taramalarını otomatize edin, eşik değerleri belirleyin ve kritik olaylar için uyarı mekanizmaları kurun. Sistemlerinizin size ne söylediğini dinleyin; genellikle büyük arızalar küçük uyarı işaretleri vererek gelir.

Bir yanıt yazın

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