Hiç kimsenin görmediği bir şey, hayal bile edemediğim nedenlerden dolayı, Apache günlük dosyası biçimini, sizin için gerçekten önemli olan bilgilerle daha kolay bir şekilde çözümlenebilir bir sürüme değiştirmek.
Örneğin, hiçbir zaman HTTP temel auth kullanmayız, bu nedenle bu alanları kaydetmemize gerek yoktur. Ben değilim her istek hizmet etmek ne kadar sürdüğünü ilgilenen, bu yüzden de ekleyeceğiz. Bir proje için, biz de herhangi sunucular yavaş diğerlerinden daha istekleri sunmaları durumunda (bizim yük dengeleyici üzerine) bilmek istiyorum, bu yüzden adını log Sunucunun sunucusuna geri dönüyoruz.
İşte bir sunucunun apache yapılandırmasından bir alıntı:
# We don't want to log bots, they're our friends
BrowserMatch Pingdom.com robot
# Custom log format, for testing
#
# date proto ipaddr status time req referer user-agent
LogFormat "%{%F %T}t %p %a %>s %D %r %{Referer}i %{User-agent}i" standard
CustomLog /var/log/apache2/access.log standard env=!robot
Bundan gerçekten söyleyemeyeceğiniz şey, her alan arasındaki değişmez sekme karakteri (\ t). Bunun anlamı, eğer Python'da bir analiz yapmak istersem, örneğin 200 olmayan statü gösterebilirim, bunu yapabilirim:
for line in file("access.log"):
line = line.split("\t")
if line[3] != "200":
print line
Ya da 'Resimlerin bağlantılarını kim yapıyor?' Yapmak istesem olurdu
if line[6] in ("","-") and "/images" in line[5]:
Bir erişim günlüğündeki IP sayıları için önceki örnek:
grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" logfile | sort -n | uniq -c | sort -n
böyle bir şey olur:
cut -f 3 log | uniq -c | sort -n
Okuması ve anlaması daha kolaydır ve 9 GB'lık kayıtlarda ne kadar sürdüğü konusunda çok büyük bir fark yaratan, daha ucuz (pahalı olmayan). Bu GERÇEKTEN temiz olduğunda, User-agent için aynı şeyi yapmak istiyorsanız. Günlükleriniz boşlukla sınırlandırılmışsa, düzenli ifade eşleştirmesi veya elle dize arama yapmanız gerekir. Bu format ile, basit:
cut -f 8 log | uniq -c | sort -n
Tam olarak yukarıdaki ile aynı. Aslında, yapmak istediğiniz herhangi bir özeti aslında tamamen aynıdır.
Kesikli olarak büyüklük sırasına göre istediğim şeyi yapacağımda neden dünyadaki sistemimin işlemcisini awk ve grep harcayacağım?