Я работал над способом проанализировать большие журналы множественного доступа (иногда в двузначной цифре ГБ в размере) для CMSs. Прямо сейчас мне просто нужны WordPress и Joomla, но я знаю, что типы будут расти со временем. В настоящее время у меня есть две остроты (они в конечном счете войдут в сценарий 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.