Назад | Перейти на главную страницу

Способы анализа комбинированных файлов журналов NCSA

Я сделал немного site: поиск с помощью Google по сбоям сервера, суперпользователю и переполнению стека. Я также проверил результаты, не относящиеся к конкретному сайту, и на самом деле не видел такого вопроса, так что вот ...

Я заметил этот вопрос, связанный с grep и awk который обладает некоторыми отличными знаниями, но я не думаю, что проблема квалификации текста была решена. Этот вопрос также расширяет сферу применения для любой платформы и любой программы.

У меня есть журналы squid или apache на основе комбинированного формата NCSA. Когда я говорю «на основе», имея в виду, что первые n столбцов в файле соответствуют объединенным стандартам NCSA, может быть больше столбцов с настраиваемыми элементами.

Вот пример строки из комбинированного журнала squid:

1.1.1.1 - - [11/Dec/2010:03:41:46 -0500] "GET http://yourdomain.com:8080/en/some-page.html HTTP/1.1" 200 2142 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; C) AppleWebKit/532.4 (KHTML, like Gecko)" TCP_MEM_HIT:NONE

Я хотел бы иметь возможность разбирать n журналы и вывод определенных столбцов для сортировки, подсчета, поиска уникальных значений и т. д.

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

Когда я заметил asql из вопроса grep / awk, я был очень взволнован, но затем понял, что он не поддерживает комбинированное из коробки, что-то, что я посмотрю на расширение, я думаю.

Жду ответов и узнаю что-то новое! Ответы не обязательно должны быть ограничены платформой или программой / языком. В контексте этого вопроса я чаще всего использую Linux или OSX.

Ура

Использование Perl, протестировано на v5.10.0, созданном для darwin-thread-multi-2level (OSX)

Чтобы распечатать столбец UserAgent:

perl -n -e '/^([^ ]+) ([^ ]+) ([^ ]+) (\[[^\]]+\]) "(.*) (.*) (.*)" ([0-9\-]+) ([0-9\-]+) "(.*)" "(.*)"/; print "$11\n"' -- test.log
  • вариант -n в то время как каждая строка в test.log
  • вариант -e однострочная программа

Я украл и подправил perlre, который я погуглил из поваренной книги PHP. Я удалил $ с конца re для поддержки пользовательских форматов на основе NCSA вместе взятых. Шаблон можно легко расширить, чтобы добавить больше групп.

Группы регулярных выражений () в конечном итоге как локальные переменные $1 к $n

Быстро и грязно, и очень легко расширяется и скрипт.

Некоторые примеры вывода вывода по конвейеру:

  • | sort | uniq уникальные значения столбца
  • | sort | uniq | wc -l уникальное количество столбцов

Критика и улучшения приветствуются

Хотя он напрямую не касается квалификации текста, одним из факторов, который можно использовать в комбинированном формате, является то, что оставшиеся столбцы с разделителями пробелами постоянно находятся в одном столбце. Таким образом, вы можете обойти проблему, используя цикл с printf и NF (количество столбцов)

Согласно awk, $ 0 - это вся строка ввода, $ 1 - это первый столбец, $ 2 - второй, и $ NF - последний.

Таким образом, для стандартного NCSA пользовательский агент - это столбцы от $ 13 до столбца $ NF.

Мне нужно было удалить первый столбец и заменить его последним столбцом измененного формата журнала (проксированный IP-адрес был добавлен в последний столбец).

Итак, что должно быть возвращено, это столбец $ NF, за которым следует второй столбец ($ 2), а затем оставшиеся столбцы до NF - 1.

Я смог сделать это с помощью следующего:

awk '{ printf "%s ", $NF; for (i=2; i<=NF-1; i++) printf "%s ", $i; printf "\n";}' < /var/log/nginx/access.log