По причинам, которые я не могу себе представить, я никогда не видел, чтобы кто-то еще делал это, изменив формат файла журнала Apache на более легко разбираемую версию с информацией, которая действительно важна для вас.
Например, мы никогда не используем базовую аутентификацию HTTP, поэтому нам не нужно регистрировать эти поля. Я буду заинтересован в том , как долго каждый запрос занимает служить, поэтому мы добавим , что в. Для одного проекта, мы также хотим знать (на нашей балансировке нагрузки) , если любые сервера обслуживать запросы медленнее , чем другие, поэтому мы регистрируем имя сервера, к которому мы возвращаемся.
Вот выдержка из конфигурации apache одного сервера:
# We don't want to log bots, they're our friends
BrowserMatch Pingdom.com robot
# Custom log format, for testing
#
# date proto ipaddr status time req referer user-agent
LogFormat "%{%F %T}t %p %a %>s %D %r %{Referer}i %{User-agent}i" standard
CustomLog /var/log/apache2/access.log standard env=!robot
Из этого нельзя сказать, что между каждым полем находится буквальный символ табуляции (\ t). Это означает, что если я хочу провести некоторый анализ в Python, например, показать не-200 статусов, я могу сделать это:
for line in file("access.log"):
line = line.split("\t")
if line[3] != "200":
print line
Или, если бы я хотел сделать, «кто ссылки горячие ссылки?» это было бы
if line[6] in ("","-") and "/images" in line[5]:
Для количества IP-адресов в журнале доступа, предыдущий пример:
grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" logfile | sort -n | uniq -c | sort -n
становится примерно так:
cut -f 3 log | uniq -c | sort -n
Легче читать и понимать, и намного дешевле в вычислительном отношении (без регулярных выражений), что при 9 ГБ журналах имеет огромное значение в том, сколько времени это займет. Когда это становится ДЕЙСТВИТЕЛЬНО аккуратно, если вы хотите сделать то же самое для User-agent. Если ваши журналы разделены пробелами, вы должны выполнить некоторое сопоставление с регулярным выражением или поиск строки вручную. С этим форматом все просто:
cut -f 8 log | uniq -c | sort -n
Точно так же, как и выше. На самом деле, любое резюме, которое вы хотите сделать, по сути точно такое же.
С какой стати я трачу центральный процессор моей системы на awk и grep, когда cut делает то, что я хочу на порядок быстрее?