Bazı rutin işleri otomatik hale getirmek, betiklerin içinde kullanmak vs gibi amaçlarla metin dosyalarını bir metin düzenleyici veya Excel gibi programlarla incelemek yerine, Linux'tan gelen bir adet olarak, komut satırı (ya da powershell) ile incelemek gibi bir alışkanlık edinmiştim.
IIS günlük dosyası üzerinden gidelim. Bu dosyaların başında (ya da hizmet yeniden başlatıldığında)
#Software: Microsoft Internet Information Services 10.0
#Version: 1.0
#Date: 2024-06-19 00:00:02
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken
gibi satırlar yer alır. Bu satırları görmezden gelerek altındaki verilere odaklanmak istiyorum. Bu dosyanın adı u_ex250619.log gibi u_ex ile başlayan, yıl (iki haneli), ay ve gün sırasıyla tarih verisi içeren ve log uzatılı bir şey olacak.
cat ./u_ex250619.log | sls "^(?!#)"
ikinci bölüm, # karakteri ile başlamayan satırları göster demek.
Alışkanlık olduğu üzere bu adımdan sonra ConvertFrom-String cmdlet'ini kullanarak bu log dosyasındaki verileri sütunlara ayırmaya çalıştım. Bu arada sütun isimleri olarak üstte verdiğim "#" ile başlayan satırların en altındaki Fields: kelimesinden sonra gelen alan adlarını kullanabilirim. Bu alan adlarından tire "-" karakterini çıkararak şöyle bir alan adları değişkeni oluşturdum:
$alan_adlari = @('date','time','sip','csmethod','csuristem','csuriquery','sport','csusername','cip','UserAgent','Referer','scstatus','scsubstatus','scwin32status','timetaken')
Şimdi bunları kullanarak, alan ayracı olarak da boşluk karakterini belirterek verileri alalım:
cat ./u_ex250619.log | sls "^(?!#)" | ConvertFrom-String -Delimiter " " -PropertyNames $alan_adlari
Bu işlem, benim örneğimde 100MB'lık bir IIS log dosyası için onlarca dakika sürdü. Nasıl hızlandırabilirim diye düşünürken ConvertFrom-String cmdlet'inden şüphelenerek yerine ConvertFrom-Csv'yi kullanmayı düşündüm. Sonuçta IIS günlük dosyaları da boşluk karakter ile ayrılmış değerlerden oluşuyor.
cat ./u_ex250619.log | sls "^(?!#)" | ConvertFrom-Csv -Delimiter " " -Header $alan_adlari
Bu cmdlet'in de -Delimiter parametresi var, ama -PropertyNames yerine -Header kullanmak gerekecek.
Bu şekilde verileri okuyabilmek sadece 1 dakika sürdü.
Bu aşamadan sonra örneğin bu log dosyasında en çok istekte bulunan 5 IP adresini tespit etmek için aşağıdaki gibi bir yöntem kullanılabilir.
cat ./u_ex250619.log | sls "^(?!#)" |
ConvertFrom-Csv -Delimiter " " -Header $alan_adlari | select cip |
Group-Object -Property cip -NoElement |
Sort-Object -Property Count -Desc |
select -First 5
Burada cip, $alan_adlari değişkeninde belirttiğimiz client-ip'nin kısaltması. Sunucumuzda en çok talep gören sayfayı (csuristem) görmek, var olmayan sayfalara (scstatus -eq 404) kimin en çok erişmeye çalıştığını görmek için yukarıdaki betik özelleştirilebilir.
Hiç yorum yok:
Yorum Gönder