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