Я работал над способом синтаксического анализа больших журналов множественного доступа (иногда размером с двузначный ГБ) для 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.