Однострочники для анализа лог-файлов Apache

Для диагностики проблем мне часто приходится просматривать логи Apache. Со временем я создал серию однострочников, которые я могу быстро скопировать и вставить для быстрого анализа лог-файла на предмет проблем, популярных страниц и прочего.

Если кто-то сообщает о медленном сайте, может быть полезным посмотреть еть ли ip-адресы с которых идет значительно больше запросов, чем с других. Это может быть индикатором плохо написанного бота, который создает большое потребление ресурсов. В других случаях медленная работа сайта может быть вызвана большим количеством трафика, так что стоит посмотреть топ источников запросов чтобы узнать откуда приходит трафик или найти наиболее популярные страницы сайта и закэшировать их.

Однострочники - это обычно первый шаг в диагностике проблемы. Например, я хочу посмотреть данные за определенный период вместо использования команды tail на логе соединений. В этом случае я использую fgrep ‘2014:05:’ ./access.log чтобы посмотреть что происходило между 5:00 и 5:59. Или, может быть, я хочу посмотреть что делал определенный IP и тогда я грепаю по IP и получаю топ 20 страниц к которым поступили запросы. Затем, возможно, сужаю поиск чтобы посмотреть только те из них, к которым поступили POST-запросы, а не GET.

Если вы не знаете awk, вы действительно должны выучить его, так как он отлично подходит для подобного рода анализа. Либо вы можете использовать grep чтобы получить необходимые данные. Вот пример описанного выше:

fgrep '2011:05:' ./access.log | fgrep '1.2.3.4' | grep 'POST' | awk '{freq[$7]++} END {for (x in freq) {print freq[x], x}}' | sort -rn | head -20

Если лог большой или вы хотите немного развлечься, вы можете сделать тоже самое на awk:

cat ./access.log | awk '$4 ~ /2011:05:/ && $1 ~ /1\.2\.3\.4/ && $6 ~ /POST/ {freq[$7]++} END {for (x in freq) {print freq[x], x}}' | sort -rn | head -20

Следующие однострочники показывают оба метода получения информации. Если вам интересно увидеть результат подачи на конвейер слишком большого количества данных, то используйте самый большой доступный лог-файл на некоторых из приведенных однострочников и вы увидите насколько быстрее они работают если sort | uniq -c передать в awk.

Топ 20 URL из последних 5000 запросов:

tail -5000 ./access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -20

tail -5000 ./access.log | awk '{freq[$7]++} END {for (x in freq) {print freq[x], x}}' | sort -rn | head -20

Топ 20 URL за исключением POST-запросов из 5000 обращений:

tail -5000 ./access.log | awk -F"[ ?]" '{print $7}' | sort | uniq -c | sort -rn | head -20

tail -5000 ./access.log | awk -F"[ ?]" '{freq[$7]++} END {for (x in freq) {print freq[x], x}}' | sort -rn | head -20

Топ 20 IP-адресов из последних 5000 запросов:

tail -5000 ./access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -20

tail -5000 ./access.log | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -rn | head -20

Топ 20 запрошенных страниц с определенного IP из последних 5000 запросов:

IP=1.2.3.4; tail -5000 ./access.log | grep $IP | awk '{print $7}' | sort | uniq -c | sort -rn | head -20

IP=1.2.3.4; tail -5000 ./access.log | awk -v ip=$IP ' $1 ~ ip {freq[$7]++} END {for (x in freq) {print freq[x], x}}' | sort -rn | head -20

Топ 20 запрошенных страниц с определенного IP за исключением POST-запросов из последних 5000 обращений:

IP=1.2.3.4; tail -5000 ./access.log | fgrep $IP | awk -F "[ ?]" '{print $7}' | sort | uniq -c | sort -rn | head -20

IP=1.2.3.4; tail -5000 ./access.log | awk -F"[ ?]" -v ip=$IP ' $1 ~ ip {freq[$7]++} END {for (x in freq) {print freq[x], x}}' | sort -rn | head -20

Топ 20 источников переходов из последних 5000 запросов:

tail -5000 ./access.log | awk '{print $11}' | tr -d '"' | sort | uniq -c | sort -rn | head -20

tail -5000 ./access.log | awk '{freq[$11]++} END {for (x in freq) {print freq[x], x}}' | tr -d '"' | sort -rn | head -20

Топ 20 user agents из последних 5000 запросов:

tail -5000 ./access.log | cut -d\  -f12- | sort | uniq -c | sort -rn | head -20

Суммарный объем данных (в MB) запрошенный в последних 5000 запросов:

tail -5000 ./access.log | awk '{sum+=$10} END {print sum/1048576}'

Оригинал.

Сие опубликовал в день года в разделах oneliner, apache, log, translation

Наверх