Satu hal yang belum pernah saya lihat dilakukan orang lain, karena alasan yang tidak dapat saya bayangkan, adalah mengubah format file log Apache menjadi versi yang lebih mudah diurai dengan informasi yang sebenarnya penting bagi Anda.
Misalnya, kami tidak pernah menggunakan autentikasi dasar HTTP, jadi kami tidak perlu mencatat bidang-bidang itu. Saya saya tertarik pada berapa lama setiap permintaan dibutuhkan untuk melayani, jadi kita akan menambahkan bahwa dalam. Untuk satu proyek, kami juga ingin tahu (pada penyeimbang beban kami) jika ada server yang melayani permintaan lebih lambat daripada yang lain, jadi kami log nama dari server yang kami proksi kembali.
Berikut kutipan dari konfigurasi apache satu server:
# 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
Apa yang Anda tidak dapat benar-benar tahu dari ini adalah bahwa antara setiap bidang adalah karakter tab literal (\ t). Ini berarti bahwa jika saya ingin melakukan beberapa analisis dengan Python, mungkin menunjukkan status non-200 misalnya, saya dapat melakukan ini:
for line in file("access.log"):
line = line.split("\t")
if line[3] != "200":
print line
Atau jika saya ingin melakukan 'siapa yang men-hotlink gambar?' itu akan
if line[6] in ("","-") and "/images" in line[5]:
Untuk jumlah IP dalam log akses, contoh sebelumnya:
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
menjadi sesuatu seperti ini:
cut -f 3 log | uniq -c | sort -n
Lebih mudah untuk membaca dan memahami, dan jauh lebih murah secara komputasi (tanpa regex) yang, pada 9 GB log, membuat perbedaan besar dalam berapa lama. Ketika ini menjadi BENAR-BENAR rapi adalah jika Anda ingin melakukan hal yang sama untuk agen-Pengguna. Jika log Anda dibatasi oleh ruang, Anda harus melakukan pencocokan ekspresi reguler atau pencarian string dengan tangan. Dengan format ini, mudah:
cut -f 8 log | uniq -c | sort -n
Persis sama dengan di atas. Sebenarnya, setiap ringkasan yang ingin Anda lakukan pada dasarnya sama persis.
Mengapa saya harus menghabiskan CPU sistem saya pada awk dan grep ketika cut akan melakukan persis apa yang saya inginkan pesanan besarnya lebih cepat?