Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разбор логов Apache на предмет уникальных IP, Не может такого быть. Нереальные цифры 
:(
    Опции темы
Xelius
Дата 12.8.2005, 13:25 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Сделал разбор логов Apache. Хотел посмотреть - сколько уникальных пользователей ходит. Требуется своя-собственная статистика...И вот что получилось. В период 16:00-20:00 число уникальных IP 18850. ТАКОГО НЕ МОЖЕТ БЫТЬ!!!!! smile
Вот пример двух строк лога.

sbn.bz 82.142.152.130 - - [10/Aug/2005:17:37:48 +0400] "GET /img/kon_14.gif HTTP/1.1" 200 1425 "http://sbn.bz/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"

kazan.ws 83.217.211.158 - - [10/Aug/2005:17:37:48 +0400] "GET /img/Pustaia_36.gif HTTP/1.1" 200 472 "http://kazan.ws/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0) Opera 7.23 [ru]"

На серваке лежит не только тот сайт, который нужен, но отсечение нужного (сами видим) происходит двумя пальцами. Мож, я чё не понимаю, но, по-моему, кол-во запросов с разых IP = кол-во уникальых посетителей. 18850 - это перебор ((((
Парсится нормально, все ИП реально разные.......В сём проблема??
  Вверх
DENNN
Дата 12.8.2005, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: нет
Всего: 43



может роботы какие или подобные индексаторы?
PM ICQ   Вверх
Xelius
Дата 12.8.2005, 14:56 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











2DENNN: Сечас разобрал ещё пару логов - та же ситуация...Если это роботы, то просто маньки какие-то, круглые сутки, 7 дней в неделю..они ж тогда афигенный траффик сделают....ХотЛоговские счётчики показывают в день по 10000 чел, а тут....Может нельзя считать уникальный ИП уникальным посетителем...Ну не использовать же алгуритмы такиз счётчиков для своей статистики
  Вверх
Bolt
Дата 12.8.2005, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 21.2.2005

Репутация: нет
Всего: нет



покажите функцию разбора строк лога
Цитата(Xelius @ 12.8.2005, 13:25)
sbn.bz 82.142.152.130 - - [10/Aug/2005:17:37:48 +0400] "GET /img/kon_14.gif HTTP/1.1" 200 1425 "http://sbn.bz/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"

и функцию подсчета уникальных IP

PM WWW ICQ   Вверх
Xelius
Дата 12.8.2005, 16:10 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Код

open LOG_FILE, "$log_file_name" or die "Error: $!";
while ($string = <LOG_FILE>)
{
  # Выделяем данные даты-времени
  $string =~ /\[(.+?)\]/gi;
  $date = $1;
# Разбираем строку на части
  ($date, $hour, $min, $sec) = split (/:/, $date);
  ($request, $from_page, $browser) = $string =~ /\"(.+?)\"/gi;
  ($site_ip) = split (/ - - /, $string);
  ($site, $ip) = split (/ /, $site_ip);
  if ($site == "kazan.ws")
  {
    if ($hash_ip{$ip} eq "") 
    {
      # собираем уникальные
      $hash_ip{$ip}=$ip;
    };
  };
};
close LOG_FILE;


Извратно, конечно. Я не смог сделать функцию вхождения в множество. Поэтому сделал через хэш. Конечное число элементов хэша и есть искомое число.
  Вверх
Bolt
Дата 12.8.2005, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 21.2.2005

Репутация: нет
Всего: нет




попробуйте разбирать строки хотя бы вот так:
Код

my ($host,$ip,undef,$date,$method,$code,$bsize,$url,$agent) = ($string=~/(\S+)\s(\S+)\s(- -)\s\[([^\]]+)\]\s\"(.*)\"\s(\d+)\s(\d+)\s\"(.*)\"\s\"(.*)\"/);

вы разбираете ВЕСЬ лог. это справедливо, если он у вас обнуляется раз в сутки. в противном случае необходимо сверять дату.


Цитата(Xelius @ 12.8.2005, 16:10)
  if ($site == "kazan.ws")
  {
    if ($hash_ip{$ip} eq "")
    {
      # собираем уникальные
      $hash_ip{$ip}=$ip;
    };
  };

это как работает? можете описать что делает каждая строка? на ваш взгляд.

Это сообщение отредактировал(а) Bolt - 12.8.2005, 19:47
PM WWW ICQ   Вверх
korob2001
Дата 13.8.2005, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



О том, как разбить строку, смотри, что написал Bolt, а насчёт этого:
Код

  if ($site == "kazan.ws")
  {
    if ($hash_ip{$ip} eq "") 
    {
      # собираем уникальные
      $hash_ip{$ip}=$ip;
    };
  };

Наверное имелось ввиду что-то типа этого:
Код

  if ($site eq "kazan.ws")        # Строки сравниваются с помощью eq, а не ==
  {
      $hash{ $ip }++;               # Это гораздо короче, быстрее и даст нам намно больше информации
  };

Теперь мы получаем не только, число посещений с разных IP адресов, но и кол-во посещений каждого IP, т.е. :
Код

# Кол-во уникальных IP
my $uniq_ips = keys %hash;

# Сколько с каждого IP было сделано запросов
while ( my( $key, $val ) = each %hash ) {
            print "$key => $val\n";
}

Можно так же записать результаты последнего цикла в файл, а ещё лучше, подсчитывать всё это в связанном с DBM файлом хеше. Тогда ничего не придётся сохранять, всё уже будет сохранено, да и с памятью не возникнет проблем когда лог разрастётся до неимоверных размеров.

Это сообщение отредактировал(а) korob2001 - 13.8.2005, 15:12


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Guest
Дата 15.8.2005, 08:50 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











С разрастанием и сравнением даты логов проблем нет - лог сохраняется в отделный файл с известным именем раз в 4 часа.
2korob2001 eq b == Запамятовалsmile) Пасиба, что поправил. Про кол-во посещений с каждого IP - именно так я и хотел сделать (сделал так, чтобы не ""), уже и сделал.
Мне кажется, что несколько корротких RegEx будут работать быстрее одного длинного. Попробую заменить сплиты на RegEx и протестить по времени.

2Bolt: korob2001 вроде пояснил, но повторю: ключом в хэше служит ИП. Если значение массива с ключом = новому -полученному ИП есть пустая строка (т.е. такого ключа нет, т.к. значение всех элементов - не пустая строка), то значит этот ИП есть уникальный, такого ещё не было и нужно его запомнить, то есть рисвоить элементу с ключом = новому ИП значение 1 (первое обращение, или как сделано, просто сам ИП, чтобы не "").

Всех благодарю за потраченное время, но проблема-то была не в этом. Проблема была в том, что при таком разборе лога (вроде правильном - даже если заменить == на eq - сайтов с буквой К вначале больше нет), число посещений уникальных ИП переваливает за 15 тысяч. Это не есть правда. Это не есть роботы, т.к. ситуация аналогична и по сей день. Начальство грозится порвать на британский флаг. Завтра пойду к техникам, которые сервер содержат. Сдаётся мне, что неправильно логгер работает.
  Вверх
Xelius
Дата 15.8.2005, 09:40 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Последнее сообщение подпись Xelius
  Вверх
korob2001
Дата 15.8.2005, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Ну для подсчёта нам нужны только первые 2 елемента:
kazan.ws 83.217.211.158
sbn.bz 82.142.152.130

Потому попробуй таким скриптом пропарсить.

Код

#!/usr/bin/perl
use strict;

my $log_file = "Путь к логу";
my %result = ();

open( LOG, "< $log_file" ) or die $!;
   while ( my $log_line = <LOG> ) {
            my( $host, $ip ) = ( split(/\s+/, $log_line) )[0,1];
            if ( $host eq 'kazan.ws' ) {
                 $result{ $ip }++;
            }
   }
close( LOG );

my $uniq_ips = keys %result;

print "Уникальных посещений: $uniq_ips\n\n";

Попробуй, потому как я не тестировал.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Xelius
Дата 15.8.2005, 12:36 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











korob2001: Thanx. Я буду собирать все данные, и время запроса и сам запрос, и айпишник, только браузер, наверно, оставлю...накой он. Ещё один момент- ну ни в какую не работает
Код

if ( $host eq 'kazan.ws' ) 
           {    
                 $result{ $ip }++;    
            }


Такой кусок работает на "ура"
Код

if ($hash_ip{$ip} eq "") 
{
  $hash_ip{$ip} = 1;
}
else
{
  $hash_ip{$ip}++;
};

Но всё равно дохрена.......Сервачники говорят, что логгер какой-то самопальный. Будут переделывать..О результах сообщу...

  Вверх
korob2001
Дата 15.8.2005, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Ну если ты хочешь проверять ключь на существование, то попробуй это условие:
Код

if ($hash_ip{$ip} eq "") 

заменить на такое:
Код

if ( exists $hash_ip{ $ip } )

Так вообще-то будет правильнее.
Цитата

Ещё один момент- ну ни в какую не работает

Скорее всего проблема в условии. Попробуй вместо этого условия воспользоваться регулярным выражением, т.е. вместо:
Код

if ( $host eq 'kazan.ws' ) {
     $hash_ip{ $ip }++;
}

напиши так:
Код

if ( $host =~ /kazan\.ws/ ) {
     $hash_ip{ $ip }++;
}

ЗЫ: Если хочешь, кинь мне свой лог, попробую помочь тебе его разобрать. Ну или какую-то его часть.

Это сообщение отредактировал(а) korob2001 - 15.8.2005, 14:22


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Xelius
Дата 15.8.2005, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 15.8.2005
Где: Казань

Репутация: нет
Всего: нет



Цитата

Код

1:if ( exists $hash_ip{ $ip } )    

Так вообще-то будет правильнее.

Согласен
Цитата

Скорее всего проблема в условии. Попробуй вместо этого условия воспользоваться регулярным выражением

Да вся проблема не разборе логов. Он разбирается без особых проблем, учитывая вывешенные здесь советы.
Вся проблема в результатах этого разбора!! Согласись, 18 тысяч посетителей на вэб-сайт - это нереально? А если разбирать лог, то так и получается...Вот я и хочу выяснить - может нельзя считать уникальный ИП уникальным посетителем?? Совсем не хочется делать счётчики, подобные рамблеровским, хотлоговским, спайлоговским.....Остаётся только грешить на логгер апачевский, что он криво работает...
PM MAIL ICQ   Вверх
Xelius
Дата 15.8.2005, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 15.8.2005
Где: Казань

Репутация: нет
Всего: нет



Решилось. Глючил логгер - он на новые ИПшники записывал текущие выполняемы запросы. Написан своими-же, теперь хотим оторвать им руки )) korob2001 закрывай тему. Спасибо за помощь ))
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0575 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.