สิ่งหนึ่งที่ฉันไม่เคยเห็นใครทำด้วยเหตุผลที่ฉันไม่สามารถจินตนาการได้คือการเปลี่ยนรูปแบบไฟล์บันทึกของ Apache เป็นเวอร์ชันที่แยกวิเคราะห์ได้ง่ายขึ้นด้วยข้อมูลที่สำคัญกับคุณ
ตัวอย่างเช่นเราไม่เคยใช้การรับรองความถูกต้องพื้นฐานของ HTTP ดังนั้นเราจึงไม่จำเป็นต้องบันทึกฟิลด์เหล่านั้น ผมรู้สึกสนใจในวิธียาวแต่ละคำขอใช้เวลาในการให้บริการดังนั้นเราจะเพิ่มว่าใน. สำหรับโครงการหนึ่งที่เรายังต้องการที่จะรู้ว่า (บน balancer โหลดของเรา) ถ้าเซิร์ฟเวอร์ใด ๆ ที่จะให้บริการการร้องขอช้ากว่าคนอื่น ๆ เพื่อให้เราเข้าสู่ระบบชื่อ ของเซิร์ฟเวอร์ที่เรากำลังจะกลับไป
นี่คือข้อความที่ตัดตอนมาจากการกำหนดค่า apache ของเซิร์ฟเวอร์เดียว:
# 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
สิ่งที่คุณไม่สามารถบอกได้จากสิ่งนี้คือระหว่างแต่ละฟิลด์คืออักขระแท็บตัวอักษร (\ t) ซึ่งหมายความว่าหากฉันต้องการทำการวิเคราะห์ใน Python อาจแสดงสถานะที่ไม่ใช่ 200 เช่นฉันสามารถทำได้:
for line in file("access.log"):
line = line.split("\t")
if line[3] != "200":
print line
หรือถ้าฉันต้องการที่จะทำ 'ใครกำลังเชื่อมโยงภาพ?' มันจะเป็น
if line[6] in ("","-") and "/images" in line[5]:
สำหรับ IP ที่นับในบันทึกการเข้าถึงตัวอย่างก่อนหน้านี้:
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
กลายเป็นอะไรเช่นนี้:
cut -f 3 log | uniq -c | sort -n
ง่ายต่อการอ่านและทำความเข้าใจและราคาที่คำนวณได้น้อยกว่า (ไม่มี regex) ซึ่งบนบันทึก 9 GB ทำให้เกิดความแตกต่างอย่างมากในระยะเวลาที่ใช้ เมื่อสิ่งนี้เรียบร้อยจริง ๆ ก็คือถ้าคุณต้องการทำสิ่งเดียวกันกับตัวแทนผู้ใช้ หากบันทึกของคุณมีการคั่นด้วยช่องว่างคุณต้องทำการจับคู่นิพจน์ปกติหรือค้นหาสตริงด้วยมือ ด้วยรูปแบบนี้มันง่าย:
cut -f 8 log | uniq -c | sort -n
ตรงกับข้างบน ในความเป็นจริงการสรุปใด ๆ ที่คุณต้องการจะเหมือนกันทุกประการ
ทำไมบนโลกนี้ฉันจะใช้ CPU ของระบบเป็น awk และ grep เมื่อตัดจะทำสิ่งที่ฉันต้องการได้อย่างรวดเร็ว