20 Mart 2017 Pazartesi

Matplotlib ile log analizi yapmak

Merhabalar; Bu blog yazımızda access.log dosyasımızdaki logları matplotlib kütüphanesini kullanarak grafiğini çıkaracağız. Dilerseniz bu log dosyasını indirebilir veya aynı formataki kendi log dosyanızı kullanabilirsiniz.
Matplotlib veriler üzerinde her türlü çizgi, histogram, bar, faz, dairesel ve daha nice grafik formatlarını sadece basit birkaç satır kod ile çıktı alabileceğimiz harika bir python kütüphanesidir. Nufus dağılımlarından, ülkedeki okuyan bilgisi, matematiksel bir denklemin grafiğinden, zararlı bir yazılımın dağılım hızı gibi aklınıza gelebilecek her türlü konuda rahatlıkla kullanabilirsiniz. İşin içine istatistiğin girdiği her konuda işinize ve ihtiyaçlarınıza fazlasıyla cevap verecektir. Günlük hayatta bir çok konuda uygulanabilir diyerek konunun girizgahını yapalım.
Yukarıda da bahsetmiş olduğumuz üzere biz bu yazımızda bir web sitesine ait access.log dosyasındaki belli bilgileri kullanarak matplotlib yardımıyla yazacağımız scripte herhangi bir access.log dosyasını vererek en çok request yapan ip adreslerini ve request değerlerini grafiğe dökeceğiz. Başlayalım!
Öncellikle aşağıdaki komut ile kütüphanemizi kuralım.
pip3 install matplotlib
Kodumuza kütüphanelerimizi dahil etmekle başlayalım.
from matplotlib import pyplot as plt #Grafikleri çizeceğimiz alan(plot)
from sys import argv #Dışarıdan argüman alacağımız için import ediyoruz.
En çok istekte bulunan n. kayda kadar listeleyeceğimiz için n argüman değerimizi ve log dosya adımızı dışardan alıyoruz.
logfile = argv[1]
n = int(argv[2])
access.log dosyamızın her bir satırı bir liste elemanı olacak şekilde log listemize atıyoruz.
with open(logfile, "r") as f:
 log = f.readlines()
Sonrasında access.log dosyamızdaki yalnızca ip sutununu alacak şekilde parse edelim ve ip değerlerimizi bir ip listesine atayalım.
ip = [i.split()[0] for i in log]
access.log dosyamızda tekrar eden ip adreslerini bire indirgiyoruz.(Tekrar durumundan önüne geçmek için)
uniq_ip = list()
[uniq_ip.append(i) for i in ip if i not in uniq_ip]
Şimdi ise her ip'den gelen toplam request sayısını bulalım. Yani frekansı.
freq = list()
[freq.append(ip.count(i)) for i in uniq_ip if i not in freq]
Request yapan ip'ler ve ip sayılarını bir liste içerisinde 2 elemanlı demetler şeklinde request sayısına göre büyükten küçüğe doğru sıralıyoruz.
eq = sorted(zip(freq, uniq_ip), reverse=True)
Şimdi plota çizeceğimiz eksen noktalarımızı belirleyelim.
y_axis  = [i[0] for i in eq] # y ekseni

# x ekseni. Her bir x noktasına bir y noktası denk geleceği için x ve y liste uzunluklarının eşit olmasına dikkat ediniz.
x_axis  = range(len(y_axis))

x_label = [i[1] for i in eq] # x eksenindeki etiket isimleri (ip adresleri)
y_axis değişkenimizde frekans sayıları, x_label değişkenimizde ise ip adresleri yer almaktadır.
# Grafiğimizi çizdik. marker ile x ve y ekseninin kesiştiği yere .(nokta) koyduk.
plt.plot(x_axis[:n], y_axis[:n], marker='.')

# x, y eksenindeki bilgi etiketlerini ve başlığı yazdırıyoruz.
plt.title(argv[1]+" File Analysis")
plt.ylabel("Total Request")
plt.xlabel("Ip Address")

# Grid ile x ve y ekseninde yatay ve dikey referans çizgilerini aktif ediyoruz.
plt.grid(True)

# X eksenimizdeki etiket alanında sayi görünmesi yerine ip adreslerini gösteriyoruz. 90 derece göndererek overlop olmasının önüne geçiyoruz.
plt.xticks(x_axis[:n], x_label[:n], rotation=90)

# y eksenimizi 50 birimlik referans çizgileri ile belirliyoruz. Daha fazla detay için küçük değer verilebilir.
plt.yticks(range(0,max(y_axis),50))

#Grafiğimizi gösteriyoruz.
plt.show()
Time to test :) En çok istek yapan ilk 10 ip'ye bakalım.
python3 log_analiz.py test_log 10
İlk paragrafta verdiğim örnek access log dosyasına bakalım.
python3 log_analiz.py access_log 30
Bu yazımızda matplotlib kütüphanesinin temel kullanımını güzel bir örnek ile anlatmış olduk. Sonraki yazılarımızda farklı grafik türlerini kullanarak örnekler yapacağız. Siz aynı örnek üzerinde request-time şeklinde grafik oluşturabilirsiniz. Tamamen size kalmış. Bir sonraki yazımızda ise dinamik grafik oluşturmayı göreceğiz. Ayrıca bu yazıda kullandığımız kodlara şuradan erişebilirsiniz. Sağlıcakla kalınız.

Kaynaklar:
http://matplotlib.org/api/pyplot_api.html

0 yorum :

Yorum Gönder