Статистика из логов Apache и nginx средствами коммандной строки linux
Вы даже не представляете как много информации можно вытащить из классического combined лога apache-а или nginx-а стандартными средствами коммандной строки.
Да, конечно, есть куча разношерстных статистик, средства консоли ни в коем случае не могут считаться их заменителями, но в случае отсутствия оных могутпредоставить хоть какую-то информацию о жизни вашего сайта.
Приступим, мы имеем в своём распоряжении лог-файл содержащий примерно такие строки:
195.189.142.153 - - [06/Jul/2009:22:09:27 +0400] "GET /css/main.css HTTP/1.1"
200 1912 "http://example.ru/main" "Opera/8.01"
Например, мы хотим выяснить наиболее популярные запросы за сегодняшний день, для этого выполним:
grep "06/Jul" /var/log/nginx/access.log | cut -d \" -f 2 | sort | uniq -c | sort
разберём комманду на составляющие:
grep "06/Jul" /var/log/nginx/access.log
Отбирает из лог-файла /var/log/nginx/access.log строки, в которых встречается “06/Jul” - таким образом мы отфильтровываем только сегодняшние запросы
cut -d \" -f 2
Обрабатывает множество строк “выдёргивая” из каждой 2-й столбец (ключ -f с параметром 2) с учетом того что разделителем столбцов является символ ” (ключ -d с параметром \”, слеш экранирует кавычку “защищая” её от коммандного интерпретатора). То есть для приведённого выше примера это подстрока GET /css/main.css HTTP/1.1
sort
Сортирует строки, это необходимо для корректной работы следующей комманды
uniq -c
Отображает только уникальные записи, ключ -c заставляет комманду выводить перед каждой строкой количество её повторений.
Подобным запросом можно получить список популярных запросов без учета типа запросов (GET, POST, OPTIONS, HEAD и т.д.)
grep "06/Jul" /var/log/nginx/access.log | cut -d \" -f 2 | cut -d ' ' -f 2
| sort | uniq -c | sort
Типы запросов:
grep "06/Jul" /var/log/nginx/access.log | cut -d \" -f 2 | cut -d ' ' -f 1
| sort | uniq -c | sort
Или же версию HTTP протокола:
grep "06/Jul" /var/log/nginx/access.log | cut -d \" -f 2 | cut -d ' ' -f 3
| sort | uniq -c | sort
Обращаю внимание на то, что второй вызов команды cut оперирует с результатом выполнения первой команды cut, вычленяя столбцы из строк вида GET /css/main.css HTTP/1.1. При этом в качестве разделителя используется пробел, для передачи пробела в качестве разделителя команде cut необходимо заключить его в одинарные кавычки.
Идём дальше, получим список активных пользователей, приняв для простоты что 1 ip адрес = 1 пользователь
grep "06/Jul" /var/log/nginx/access.log | cut -d ' ' -f 1 | sort
| uniq -c | sort
Количество уникальных пользователей
grep "06/Jul" /var/log/nginx/access.log | cut -d ' ' -f 1 | sort
| uniq | wc -l
В последнем примере появилясь новая команда
wc -l
Команда wc позволяет посчитать количество строк, слов и символов в каком либо файле или потоке ввода. Ключ -l указвает что необходимо посчитать и отобразить только количество строк.
И на последок тяжёлая артиллерия:
Почасовая динамика количества запросов
grep "06/Jul" /var/log/nginx/access.log | cut -d [ -f 2 | cut -d ] -f 1
| cut -d : -f 1,2 | uniq -c
Три подряд идущих оператора cut позволяют оставить в наборе строк только дату и час, uniq -c оставляет уникальные строки и считает их количество. Оператор sort не применяется поскольку дата/время в лог файле и так записываются в порядке возрастния (машину времени пока еще не изобрели ;) )
Отданный траффик.
grep "06/Jul" /var/log/nginx/access.log | cut -d \" -f 3 | cut -c 6-
| awk '{ s += $1 } END { print s }'
Этот пример пожалуй оставлю без комментариев, т.к. для полноценного описания работы awk одной заметки явно мало, да честно говоря я пока и не готов подробно рассказать что там и к чему.
(Скопировано с сайта http://grezz.ru/?p=164)
- Alex's blog
- Добавить комментарий
- 345 просмотров

Последние комментарии
22 недели 2 дня назад
23 недели 2 дня назад
29 недель 2 дня назад
30 недель 6 дней назад
30 недель 6 дней назад
30 недель 6 дней назад
31 неделя 4 дня назад
34 недели 15 часов назад
34 недели 1 день назад
36 недель 5 дней назад