Эффективный способ разбора Apache Access Log для входов в CMS

Я работал над способом разбора больших журналов множественного доступа (иногда в двузначном ГБ) для CMS. Сейчас мне просто нужны WordPress и Joomla, но я знаю, что типы будут расти со временем. В настоящее время у меня есть два oneliners (они в конечном итоге войдут в сценарий BASH, поэтому можно использовать любой язык сценариев, если только BASH может его интерпретировать):

echo -e "\n=== WordPress ===\n"; grep --no-messages wp-login.php /usr/local/apache/domlogs/* | grep POST | grep "$(date +"%d/%b/%Y")" | cut --fields=1 --delimiter=: | sort | uniq --count | sort --reverse --numeric-sort | head | sed 's/^ *//g'

echo -e "\n=== Joomla ===\n"; grep --no-messages '/administrator/index.php' /usr/local/apache/domlogs/* | grep POST | grep "$(date +"%d/%b/%Y")" | cut --fields=1 --delimiter=: | sort | uniq --count | sort --reverse --numeric-sort | head | sed 's/^ *//g'

Я пытаюсь найти способ ускорить и объединить их, поэтому мне нужно сделать только один проход, а затем поместить их в отдельные списки. Так, например, вывод будет выглядеть примерно так:

=== WordPress ===

896 /usr/local/apache/domlogs/blogp.com
52 /usr/local/apache/domlogs/blogt.com
9 /usr/local/apache/domlogs/blog.com

=== Joomla ===

65778 /usr/local/apache/domlogs/bloge.com
478 /usr/local/apache/domlogs/blogq.com
83 /usr/local/apache/domlogs/blogh.com

Я знаю, что есть более быстрые методы синтаксического анализа, просто есть grep, но мои знания очень ограничены, поэтому любая помощь будет принята с благодарностью.

1 ответ

Это немного зависит от того, как вы настроите Apache для форматирования вашего access_log. Если вы используете общий формат журнала "CLF":

LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/access_log common

Затем 7-е поле содержит URL запроса. Быстрый бит awk который всегда присутствует и достаточно эффективен при разборе текста. (Linux почти всегда имеет расширенный GNU awk по умолчанию; в Solaris лучше убедиться, что gawk) Это позволяет вам делать несколько вещей за один проход:

awk '
   $7 ~ /wp-login.php/ {print $0 }
   $7 ~ /\/administrator\/index.php/ {print $0}
' access_log

будет искать 7-е поле $7 с регулярным выражением ~, заключенным в / косые черты. Когда совпадение найдено, выполняется { действие}, заключенное в фигурные скобки. Простое действие $print вся строка $0 содержит совпадение.

Немного более сложное действие с обновлением счетчиков в сочетании с блоком END:

awk '
   $7 ~ /wp-login.php/ {++wp }
   $7 ~ /\/administrator\/index.php/ {++jl}
   END   { print wp , " WordPress Logins found.\n" , jl , " Joomla logins found.\n" }
' access_log

Примечание. Изучите правильный язык сценариев. Это почти обязательно для профессионального системного администратора. Фактический язык не так важен, часто в магазине есть уже установленный внутренний стандарт сценариев, и тогда вы можете нанять кого-нибудь наставника.
Базовые знания bashsed а также awk а различные утилиты командной строки в дополнение к grep покажут вам только что. Дополнить это чем-то вроде perl, python, ruby, четное php или PowerShell в среде Windows.

Другие вопросы по тегам