Wed 21 Jan 2009
Продвинутый awk для анализа логов
Posted by Alrond | Tags: хостинг : iptables : Linux : nginx : сервер :
Мне нравится использовать в логах tab как разделитель. Это упрощает анализ с помощью таких утилит как awk.
Собственно под эту задачу я использую небольшой скрипт awkt.
Формат команды:
1,2 и т.д. - номер значения в строке лога, которые надо выводить
Формат лога для Nginx-а у меня выглядит так:
a
А если так:
Можно очень быстро проделывать такие штуки:
Собственно под эту задачу я использую небольшой скрипт awkt.
Формат команды:
awkt [s] [1] [2] ...s - необязательный параметр, считает и сортирует уникальные значения
1,2 и т.д. - номер значения в строке лога, которые надо выводить
Формат лога для Nginx-а у меня выглядит так:
a
log_format main '$remote_addr $geo "$remote_user" [$time_local] ' '"$request" $status $bytes_sent ' '$backend $upstream_response_time "$http_referer" ' '"$http_user_agent" $gzip_ratio';Данные поступают через pipe, формат запуска, такой:
cat access.log | awkt 5 6выведет два столбца с запросом($request) и кодом ответа($status).
А если так:
cat access.log | awkt s 9 5то можно посмотреть распределение времени ответа по запрашиваемым страницам
Можно очень быстро проделывать такие штуки:
- Распределение запросов по странам
cat access.log | awkt s 2
Результат, как пример:
[skip] 276 ES 321 IT 463 UA 502 GB 510 FR 1025 SE 1303 NL 1904 RU 3598 DE 21472 US - Количество запросов, переданных бекенду и отданных закешированной статикой ($backend)
cat access.log | awkt s 8
Результат:
13670 0 20767 1
- Количество запросов с одного IP вместе с юзер-агентом
cat access.log | awkt s 1 11
Результат:
[skip] 353 208.36.144.9 "Mozilla/5.0 (Twiceler-0.9 http://www.cuil. com/twiceler/robot.html)" 473 67.195.37.108 "Mozilla/5.0 (compatible; Yahoo! Slurp/3.0; http://help.yahoo.com/help/us/ysearch/slurp)" 694 67.195.37.108 "Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)" 976 78.46.75.108 "Mozilla/5.0 (compatible; heritrix/${pom. version} +http://seekda.com)" 1700 66.249.71.47 "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" 1720 66.249.71.46 "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" 1769 66.249.71.45 "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" 3084 66.150.96.121 "FeedBurner/1.0 (http://www.FeedBurner.com)"Как видно, в топе, конечно, боты :)
А если совместить это с другими командами, то можно в крон поставить наблюдалку и блокировать особо зарвавшихся юзеров в iptables (исключая конечно гугл и т.п.)
tail -n 1000 access.log | grep -v -E "FeedBurner|Yahoo|Google| msnbot|Yandex" | awkt s 1 | awk '{if($1 > 100) print $2}' | while read ip; do iptables -A INPUT -s $ip -j TARPIT; done;(если у вас в системе нет модуля TRAPIT для ibtables, то можно использовать стандартный DROP)
П.С. для таких случаев лучше использовать limit_req_zone, limit_conn, limit_zone в самом nginx-е или limit в iptables
- Время генерации ответа
cat access.log | awkt s 9
Результат:
[skip] 409 0.003 474 0.009 491 0.047 648 0.045 697 0.044 770 0.010 837 0.024 1112 0.001 1258 0.043 1908 0.002 13952 -А вот так потом можно график построить:
cat access.log | awkt 9 | sort | uniq -c
Если совместить это с $request, то можно узнать, какие страницы тормозят:
cat access.log | awkt 9 5 | sort -n
Результат:
[skip] 0.947 "POST /XXX HTTP/1.1" 0.948 "GET /XXX HTTP/1.1" 1.064 "GET /XXX HTTP/1.1" 1.153 "POST /XXX HTTP/1.0" 1.161 "GET /XXX HTTP/1.1"
- Самые запрашиваемые страницы
cat wipmania.log | awkt s 5
Результат:
[skip] 548 "GET /XXX HTTP/1.1" 628 "GET / HTTP/1.0" 736 "GET /XXX HTTP/1.1" 860 "GET /XXX HTTP/1.1" 1244 "GET /XXX HTTP/1.1" 1687 "GET / HTTP/1.1" - Какой сайт принес больше всего трафика
cat wipmania.log | awkt s 10
Результат:
[skip] 442 "http://www.A.com/A" 459 "http://www.B.com/B" 708 "http://www.C.com/C" 760 "http://www.D.com/D" 25338 "-"
English
Русский

May 27th, 2009 at 10:43 a.m.
А мне возможностей awstats хватает. Такое можно сделать в качестве тренировки.