В табл. 10.1 перечислены поля в файле access_log .
Таблица 10.1.Значения полей в файле access_log
Поле |
Значение |
1 |
IP-адрес хоста, обратившегося к серверу |
2–3 |
Защитная информация для соединений HTTPS/SSL |
4 |
Дата и часовой пояс данного запроса |
5 |
Метод вызова |
6 |
Запрошенный URL |
7 |
Использованный протокол |
8 |
Код результата |
9 |
Число переданных байтов |
10 |
Ссылающийся домен |
11 |
Строка идентификации браузера |
Типичная строка в access_log имеет следующий вид:
65.55.219.126 — [04/Jul/2016:14:07:23 +0000] "GET /index.rdf HTTP/1.0" 301
310 "-" "msnbot-UDiscovery/2.0b (+http://search.msn.com/msnbot.htm)""
Код результата 301 (поле 8) указывает, что запрос был успешно обработан. Ссылающийся домен (поле 10) определяет URL страницы, которую пользователь просматривал непосредственно перед запросом. Десять лет тому назад в этом поле передавался URL предыдущей страницы; теперь, по соображениям безопасности, в нем обычно указывается "-", как показано в примере.
Количество обращений к сайту можно определить, подсчитав строки в файле журнала, а диапазон дат записей в файле — по первой и последней строкам.
$ wc −l access_log
·· 7836 access_log
$ head -1 access_log; tail -1 access_log
69.195.124.69 — [29/Jun/2016:03:35:37 +0000]…
65.55.219.126 — [04/Jul/2016:14:07:23 +0000]…
Используя эту информацию, сценарий в листинге 10.1 выводит большой объем статистической информации из файла журнала access_log в формате веб-сервера Apache. Предполагается, что сценарии scriptbc и nicenumber, написанные нами в главе 1, находятся в одном из каталогов, перечисленных в переменной окружения PATH.
Листинг 10.1.Сценарий webaccess
··#!/bin/bash
··# webaccess — анализирует файл журнала access_log в формате веб-сервера
··#·· Apache, извлекая полезную и интересную статистическую информацию.
··bytes_in_gb=1048576
··# Измените следующую переменную, чтобы она соответствовала имени хоста
··#·· вашего веб-сервера, чтобы отфильтровать запросы, обусловленные
··#·· внутренними переходами, при анализе ссылающихся доменов.
··host="intuitive.com"
··if [$# −eq 0]; then
····echo "Usage: $(basename $0) logfile" >&2
····exit 1
··fi
··if [! -r "$1"]; then
····echo "Error: log file $1 not found." >&2
····exit 1
··fi
firstdate="$(head -1 "$1" | awk '{print $4}' | sed 's/\[//')"
··lastdate="$(tail -1 "$1" | awk '{print $4}' | sed 's/\[//')"
··echo "Results of analyzing log file $1"
··echo ""
··echo " Start date: $(echo $firstdate|sed 's/:/ at /')"
··echo " End date: $(echo $lastdate|sed 's/:/ at /')"
··hits="$(wc −l < "$1" | sed 's/[^[: digit: ]]//g')"
··echo "········ Hits: $(nicenumber $hits) (total accesses)"
··pages="$(grep −ivE '(.gif|.jpg|.png)' "$1" | wc −l | sed 's/[^[: digit: ]]//g')"
··echo "·· Pageviews: $(nicenumber $pages) (hits minus graphics)"
··totalbytes="$(awk '{sum+=$10} END {print sum}' "$1")"
··/bin/echo −n " Transferred: $(nicenumber $totalbytes) bytes "
··if [$totalbytes −gt $bytes_in_gb]; then
····echo "($(scriptbc $totalbytes / $bytes_in_gb) GB)"
··elif [$totalbytes −gt 1024]; then
····echo "($(scriptbc $totalbytes / 1024) MB)"
··else
····echo ""
··fi
··# Теперь выберем из журнала некоторые полезные данные.
··echo ""
··echo "The 10 most popular pages were: "
··awk '{print $7}' "$1" | grep −ivE '(.gif|.jpg|.png)' | \
···· sed 's/\/$//g' | sort | \
···· uniq −c | sort −rn | head -10
··echo ""
··echo "The 10 most common referrer URLs were: "
··awk '{print $11}' "$1" | \
····grep −vE "(^\"-\"$|/www.$host|/$host)" | \
····sort | uniq −c | sort −rn | head -10
··echo ""
··exit 0
Рассмотрим каждый блок как отдельный небольшой сценарий. Например, первые несколько строк извлекают начальную и конечную дату (переменные firstdate и lastdate)
, просто читая четвертое поле в первой и последней строках в файле. Количество посещений определяется подсчетом строк в файле с помощью wc
, а количество просмотренных страниц — как разность посещений и запросов файлов изображений (то есть файлов с расширениями .gif, jpg и .png ). Общее количество отправленных байтов определяется как сумма значений десятого поля во всех строках, которая затем обрабатывается сценарием nicenumber для удобочитаемости.
Читать дальше