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

Эффективный способ анализа журнала доступа Apache для входа в 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, но мои знания очень ограничены, поэтому любая помощь будет принята с благодарностью.

Это немного зависит от того, как вы настраиваете 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.