User Tools

Site Tools


Sidebar


Tags Cloud
logrep

Анализ логов nginx / apache с помощью скриптов wtop и logrep

Фантастически полезная вещь для анализа логов вебсервера.

Очень быстро позволяют отловить медленные выполняющиеся запросы, найти использованную уязвимость, определить файлы с самым большим количеством трафика, отфильтровать ддос-ботов, выбрать самые популярные файлы для перемещения на SSD-кеш, собирать гео-статистику в live режиме, а так же железным аргументом дерзко попячить гордое щячло любителей денвера.

Скрипты написаны на python, соответственно, работать должны везде.

Брать по адресу http://code.google.com/p/wtop/

Главная утилита - logrep.
wtop лично мне не пригодился.

Руководство к logrep: http://code.google.com/p/wtop/wiki/UsingLogrep
Примеры использования: http://code.google.com/p/wtop/wiki/LogrepCookbook

Самое замечательное в logrep - это возможность применять к выводимым значениям операторы.
Т.е. мы можем полностью сформировать вывод скрипта, состоящий из заданных нами параметров и с примененными к ним необходимыми операторами.

Полный список выходных параметров, которыми мы можем оперировать, указан в руководстве под строкой AVAILABLE FIELDS.

Ключ -o позволяет указать используемые в output значения, разделенные табуляцией. К каждому выводимому зачению можно применить оператор.

Список операторов

count(*)     
avg(FIELD)   mean average
min(FIELD)   lowest seen value
max(FIELD)   highest seen value
sum(FIELD)   summation of all values
var(FIELD)   population variance
dev(FIELD)   deviation (square root of variance)

Ключ -s позволяет нам сортировать список, используя параметры вида -s "LIMIT:FIELDS:DIRECTION",
где LIMIT - это общее количество выводимых строк, FIELDS - выводимые значения, а DIRECTION - направление сортировки: 'd' - descending (по умолчанию), 'a' - acending.

Формирование списка наиболее востребованных файлов для выноса на SSD-диск (для Nginx)

Т.к. изначально скрипт создавался для работы с CustomLog типа combined вебсервера Apache, нам необходимо добавить в формат лога nginx переменную $request_time.

Формат лога для nginx

log_format mp4 '$remote_addr - $remote_user [$time_local] '
              '"$request" $status $body_bytes_sent "$http_referer" '
              '"$http_user_agent" $request_time' ;

Сортировка по top10 URL:

# logrep -o 'url,count(*)' -s '10:2' /home/log/httpd/yziltz.com/access_log

/videos/ztod.com/546fg/168nzrr/1.mp4            324
/videos/wtfpass/104ghd/560wyqe/1.mp4            259
/videos/evilangel/1004hf/457elux/1.mp4          205
/videos/ztod.com/546fg/84rqek/1.mp4             203
/videos/wtfpass/104ghd/505dtve/1.mp4            192
/videos/realitykings/986fk/314qiga/1.mp4        173
/videos/wtfpass/104ghd/18ifvr/1.mp4             153
/videos/brazzers/758gf/350ihij/1.mp4            143
/videos/wtfpass/104ghd/533jdzo/1.mp4            125
/videos/bangbros/754hj/100geoo/1.mp4            122

где параметрами -o являются

url - URL файла
count(*) - количество всех уникальных вхождений URL,

а параметрами -s

10 - это количество выводимых файлов,
2 - сортировка по полю #2.

В нашем случае поле #2 - это count(*).
Тип сортировки не указан и по умолчанию это 'd' - descending.

Сортировка по top10 URL с отображением дополнительных параметров:

Добавим новые значения в список параметров:

# logrep -o 'url,count(*),avg(msec),sum(bytes)' -s '10:2' /home/log/httpd/yziltz.com/access_log

/videos/evilangel/1004hf/457elux/1.mp4          800     63330.12        1265011232
/videos/wtfpass/104ghd/18ifvr/1.mp4             446     55150.93        199966883
/videos/naughty_america/634fs/6kryk/1.mp4       413     66149.11        422437989
/videos/naughty_america/634fs/83nbna/1.mp4      361     41608.23        284347235
/videos/wtfpass/104ghd/606pfgb/1.mp4            352     35669.83        129798205
/videos/wtfpass/104ghd/216pcko/1.mp4            330     50201.86        563510318
/videos/ztod.com/546fg/168nzrr/1.mp4            325     48295.78        238183106
/videos/wtfpass/104ghd/560wyqe/1.mp4            311     121607.30       4415056002
/videos/wtfpass/104ghd/387jkmy/1.mp4            309     52073.58        677026365
/videos/wtfpass/104ghd/505dtve/1.mp4            240     233122.70       1272250219

Дополнительными параметрами будут avg(msec) - среднее время отдачи файла и sum(bytes) - общий трафик, пришедшийся на этот файл.

А теперь добавим фильтр -f, в котором выведем результаты только за последний час (3600 секунд).
Для этого мы применим unixtime как самый простой способ.

# CUR_DATE=`date +"%s"`; HOUR_OFFSET=`echo "$CUR_DATE - 3600" | bc`; logrep -f "ts<$HOUR_OFFSET" -o 'url,count(*),avg(msec),sum(bytes)' -s '10:2' /home/log/httpd/yziltz.com/access_log
/videos/ztod.com/546fg/168nzrr/1.mp4            325     48295.78        238183106
/videos/wtfpass/104ghd/560wyqe/1.mp4            267     117390.16       2869373722
/videos/evilangel/1004hf/457elux/1.mp4          225     152913.27       954288822
/videos/ztod.com/546fg/84rqek/1.mp4             203     55998.36        188930211
/videos/wtfpass/104ghd/505dtve/1.mp4            196     216440.77       1093232840
/videos/realitykings/986fk/314qiga/1.mp4        173     203926.49       973211068
/videos/wtfpass/104ghd/18ifvr/1.mp4             161     114550.71       145899888
/videos/wtfpass/104ghd/533jdzo/1.mp4            147     182660.09       1100896430
/videos/bangbros/754hj/100geoo/1.mp4            145     175528.83       609455138
/videos/brazzers/758gf/350ihij/1.mp4            143     213783.88       144107563
logrep.txt · Last modified: 2013/12/15 16:53 by kyxap