Появилась необходимость получить статистику самых частых ошибок на основе анализа apache(nginx) access логов.
Размер логов > 5 Гб за сутки.Пример желаемого отчета:
<кол-во повторов ошибки> <код (404,503 ...)> <запрос> <domain> <reffer>
<кол-во повторов ошибки> <код (404,503 ...)> <запрос> <domain> <reffer>
...AWStats - не получается использовать т.к. процесс анализа умирает из-за огромного размера лога
Анализатор visitors (http://www.hping.org/visitors/) - не показывает рефферы 404 ошибок, без реффера невозможно определить адрес страницы на которой находится битая ссылка
Написал простенький анализатор на основе awk
awk '($9 !~ /200|304/)' $log | awk '{print $9,$7,$11}' | sort | uniq -c | sort -r -n | head -n 70
В результате его работы получаю отчет вида
<кол-во повторов ошибки> <код (404,503 ...)> <запрос> <reffer>Вопрос: существуют ли другие решения которые могут предоставить расширенную статистику ошибок на основе access логов?
ротация лога раз в несколько часов + австатс на более мелких кусках
>[оверквотинг удален]
>Написал простенький анализатор на основе awk
>
>awk '($9 !~ /200|304/)' $log | awk '{print $9,$7,$11}' | sort |
>uniq -c | sort -r -n | head -n 70
>
>В результате его работы получаю отчет вида
><кол-во повторов ошибки> <код (404,503 ...)> <запрос> <reffer>
>
>Вопрос: существуют ли другие решения которые могут предоставить расширенную статистику ошибок на
>основе access логов?
>[оверквотинг удален]
>>Написал простенький анализатор на основе awk
>>
>>awk '($9 !~ /200|304/)' $log | awk '{print $9,$7,$11}' | sort |
>>uniq -c | sort -r -n | head -n 70
>>
>>В результате его работы получаю отчет вида
>><кол-во повторов ошибки> <код (404,503 ...)> <запрос> <reffer>
>>
>>Вопрос: существуют ли другие решения которые могут предоставить расширенную статистику ошибок на
>>основе access логов?От себя ничего полезного посоветовать не могу, но пока в качестве временных мер хочу предложить вместо awk использовать perl. сам на себе проверил что на больших файлах perl работает заметно шустрее чем awk, правда у меня файлы были от 100 мегбайт.
и кстати
awk '($9 !~ /200|304/ {print $9,$7,$11})' $log должно работать быстрее :-)СОРРИ за флуд
Во первых perl быстрее, во вторых больше возможностей. Обрабатывались им и куда большие объемы. Правильно написанный вариант на perl справится с таким объемом за несколько минут. При желании можно его вообще сделать работающим по принципу tail -f да еще и интерактивным.
Если с perl не дружите, то опишите _детально_ задачу, как будет время займусь.
>Во первых perl быстрее, во вторых больше возможностей. Обрабатывались им и куда
>большие объемы. Правильно написанный вариант на perl справится с таким объемом
>за несколько минут. При желании можно его вообще сделать работающим по
>принципу tail -f да еще и интерактивным.
>Если с perl не дружите, то опишите _детально_ задачу, как будет время
>займусь.спасибо
понял
1. готовых решений для анализа больших логов (вроде awstats) нет
2. нужно изучать perl
3. частая ротация
>Пример желаемого отчета:
><кол-во повторов ошибки> <код (404,503 ...)> <запрос> <domain> <reffer>
><кол-во повторов ошибки> <код (404,503 ...)> <запрос> <domain> <reffer>нужен визуальный пример строки, которую нужно зацепить
ну и также не помешает пример строки, которую цеплять не нужнону а на основе пока имеющихся данных будет как-то так:
#!/usr/bin/perl
use warnings;
my$from="/path/to/logfile"; # откуда брать данные для обработки
my$to="/report/file"; # куда скидывать обработанный выводopen(FH,"$from");
open(TO,">$to");
while(<FH>){
next if !/код (404,503)/g;
$total++;
print TO "$_"; # не ставлю \n, потому что строки в исходном файле уже с ним
}
print TO "\nвсего ошибок: $total\n";получите список ошибок 404,503 и общее их кол-во в файл /report/file
попался мне тут лог httpd_access на глаза. соот-но, код меняем на этот:#!/usr/bin/perl
use warnings;
$from="httpd_access.log";
$to="httpd_parsed";
$total403=$total404=0;open(FH,"$from")or die"не открывается $from: $!\n";
open(NEW,">$to");while(<FH>){
next if !/" (?:403|404) \d/;if(/" 403 \d/){print NEW "$_";$total403++}
if(/" 404 \d/){print NEW "$_";$total404++}
}
print NEW "\nвсего ошибок 403: $total403
всего ошибок 404: $total404\n";
Народ, помогите плиз?
Нужно написать скрипт на перл а у меня с ним опыта вобще никакого.
Задача:
Есть 4 папки в папке /weblogs
в каждой из них лежит немерянное количество архивированных логов апача.
Теперь есть файлик с 80тью IP адресами, и надо получить отчет какой адрес в каком файле встречается.Человек который поставил задачу посоветовал применить перл хэши.
Вот сижу теперь ломаю голову что это такое и с чем его едят :(Заранее благодарен за помощь.