Saya dapat menggunakan penganalisis log, tetapi sering saya harus mengurai log web baru-baru ini untuk melihat apa yang terjadi saat ini.
Saya kadang-kadang melakukan hal-hal seperti mencari tahu 10 ips teratas yang meminta file tertentu
cat foo.log | grep request_to_file_foo | awk '{print $1}' | sort -n | uniq -c | sort -rn | head
Apa yang Anda miliki di kotak alat Anda?
Jawaban:
Anda dapat melakukan hampir semua hal dengan file log apache dengan awk saja. File-file log Apache pada dasarnya dipisahkan oleh spasi, dan Anda dapat berpura-pura bahwa kutipan tidak ada, dan mengakses informasi apa pun yang Anda minati berdasarkan nomor kolom. Satu-satunya saat ini rusak adalah jika Anda memiliki format log gabungan dan tertarik pada agen pengguna, di mana Anda harus menggunakan tanda kutip (") sebagai pemisah dan menjalankan perintah awk terpisah. Berikut ini akan menunjukkan kepada Anda IP dari setiap pengguna yang meminta halaman indeks diurutkan berdasarkan jumlah klik:
$ 7 adalah url yang diminta. Anda dapat menambahkan kondisi apa pun yang Anda inginkan di awal. Ganti '$ 7 == "/" dengan informasi apa pun yang Anda inginkan.
Jika Anda mengganti $ 1 dalam (ipcount [$ 1] ++), maka Anda dapat mengelompokkan hasilnya berdasarkan kriteria lain. Menggunakan $ 7 akan menunjukkan halaman apa yang diakses dan seberapa sering. Tentu saja Anda ingin mengubah kondisi di awal. Berikut ini akan menunjukkan halaman apa yang diakses oleh pengguna dari IP tertentu:
Anda juga dapat mem-pipe output melalui sortir untuk mendapatkan hasil secara berurutan, baik sebagai bagian dari perintah shell, atau juga dalam skrip awk itu sendiri:
Yang terakhir akan berguna jika Anda memutuskan untuk memperluas skrip awk untuk mencetak informasi lainnya. Ini semua masalah apa yang ingin Anda ketahui. Ini harus berfungsi sebagai titik awal untuk apa pun yang Anda minati.
sumber
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:
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:
Atau jika saya ingin melakukan 'siapa yang men-hotlink gambar?' itu akan
Untuk jumlah IP dalam log akses, contoh sebelumnya:
menjadi sesuatu seperti ini:
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:
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?
sumber
cut -f 3 log | uniq -c | sort -n
, agen penggunacut -f 8 log | uniq -c | sort -n
.Lupakan awk dan grep. Lihat asql . Mengapa menulis skrip yang tidak dapat dibaca ketika Anda dapat menggunakan sintaks seperti sql untuk menanyakan file log. Misalnya.
sumber
Berikut ini adalah skrip untuk menemukan url teratas, rujukan teratas dan agen pengguna teratas dari entri log N terbaru
Sumber
sumber
untuk jumlah IP dalam log akses:
Agak jelek, tapi berhasil. Saya juga menggunakan yang berikut ini dengan netstat (untuk melihat koneksi aktif):
Mereka adalah beberapa "one liners" favorit saya :)
sumber
Membuat daftar pertanyaan umum akan menjadi indeks yang bagus untuk jawaban atas pertanyaan ini. Pertanyaan umum saya adalah:
Saya melihat perubahan seperti itu dengan memonitor halaman status server (via mod_status) untuk hitrate dan perkiraan waktu respons untuk permintaan yang aktif dan yang baru saja diselesaikan (mengetahui sepenuhnya bahwa saya kehilangan setumpuk data yang besar, tetapi sampelnya cukup bagus).
Saya menggunakan arahan LogFormat berikut (% T sangat berguna)
Saya mencari sebab-akibat dan apa yang terjadi pertama kali ... biasanya tentang himpunan bagian pola tertentu dalam log saya, jadi saya perlu mengetahui yang berikut untuk setiap pola / ekspresi reguler yang diberikan:
Saya biasanya menggunakan perl, karena pada akhirnya menjadi cukup kompleks untuk menjadi berharga.
Contoh non-perl adalah quickrate hitrate per menit untuk kode status non-200:
Ya saya selingkuh dengan grep itu, menganggap kutipan-ruang-200-cocok hanya kode status http .... bisa menggunakan awk atau perl untuk mengisolasi bidang hanya perlu diingat itu bisa tidak akurat.
Contoh yang lebih kompleks dalam perl mungkin untuk memvisualisasikan perubahan dalam hitrate untuk suatu pola.
Ada banyak yang harus dikunyah dalam skrip di bawah ini, terutama jika Anda tidak terbiasa dengan perl.
kode berikut:
Jika Anda hanya ingin memproses metrik standar, checkout
sumber
Di sini contoh 'sed' saya, ia membaca format default dari apache logs dan mengubahnya menjadi sesuatu yang lebih nyaman untuk pemrosesan otomatis. Seluruh baris didefinisikan sebagai ekspresi reguler, variabel disimpan dan ditulis ke keluaran dengan '#' sebagai pemisah.
Notasi input yang disederhanakan adalah:% s% s% s [% s] "% s"% s% s "% s" "% s"
Contoh input line: xx.xx.xx.xx - - [29 / Mar / 2011: 12: 33: 02 +0200] "DAPATKAN /index.html HTTP / 1.0" 200 9443 "-" "Mozilla / 4.0"
Contoh output line: xx.xx.xx.xx # - # - # 29 / Mar / 2011: 12: 33: 02 + 0200 # GET /index.html HTTP / 1.0 # 200 # 9443 # - # Mozilla / 4.0
Rasakan kekuatan ekspresi reguler :-)
sumber
Saya sering menggunakan awk dengan mengekor atau melampirkan file. Setiap malam saya mengirimkan sendiri laporan web untuk setiap server. Bergantung pada file log Anda dan LogFormat Anda, Anda perlu mengedit beberapa liner yang sesuai untuk Anda ...
Ini contoh sederhana:
Jika saya ingin mengekstrak log di server saya hanya untuk 404/500 kode status saya akan melakukan ini:
<snip>
</ snip>
sumber
Siapa yang menautkan panas gambar Anda:
sumber
Hal yang saya cenderung lakukan sebagian besar waktu adalah membaca bagian-bagian log berdasarkan waktu, jadi saya menulis skrip berikut menggunakan sed untuk mencabut periode yang saya minati, ini bekerja pada setiap file log yang saya datangi menemukan dan dapat menangani log yang diarsipkan juga.
sumber
Meskipun tidak sed atau awk, ada dua hal yang menurut saya berguna untuk menangani file log apache dan icecast.
AWStats memiliki skrip yang sangat berguna yang disebut logresolvemerge.pl yang akan menggabungkan beberapa file log terkompresi atau tidak terkompresi, strip dupes dan urutkan berdasarkan timestamp. Itu juga dapat melakukan pencarian DNS dan dikonfigurasi untuk menjalankan multithreaded. Ini sangat berguna saat menggunakan dengan awstats karena awstats tidak dapat menambahkan baris log dengan stempel waktu lebih lama dari database saat ini, jadi semua harus ditambahkan secara berurutan, tetapi itu sangat mudah karena Anda hanya membuang semua yang ada di logresolvemerge.pl dan semuanya muncul dengan baik.
sed dan awk cukup buruk dalam menangani kurma karena mereka umumnya memperlakukan mereka sebagai string. awk memiliki beberapa fungsi waktu dan tanggal, tetapi mereka tidak banyak. Misalnya mengekstraksi rentang garis antara dua stempel waktu sulit jika stempel waktu yang tepat tidak muncul dalam file (bahkan jika nilai di antara mereka melakukannya) - contoh Chris 'memiliki masalah ini persis. Untuk mengatasinya, saya menulis skrip PHP yang melaporkan rentang cap waktu file log dan juga dapat mengekstraksi potongan berdasarkan rentang cap waktu, menggunakan format tanggal atau waktu apa pun yang Anda suka (tidak perlu mencocokkan format cap waktu file log).
Untuk mempertahankan topik ini, berikut adalah beberapa contoh berguna: Dapatkan total jumlah byte yang dilayani dari apache atau log icecast:
Dapatkan total jumlah detik yang terhubung dari log icecast:
sumber
Memulihkan utas lama ini, setelah menyerah pada asql untuk file log besar, mencari solusi againg, juga di serverfault, saya menemukan tentang wtop di sini ini adalah alat opensource, yang mampu melakukan pemantauan langsung atau memproses log dan mendapatkan statistik (atas N), sangat fleksibel dan kuat, tempat resmi ada di sini
sumber