[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Хранение логов в БД
paul85
Здравствуйте, многоуважаемые гуру!

Назрела необходимость хранить/собирать статистику посещений серверными инструментами. То есть не популярными JS сценариями от Yandex или Google. В связи с чем возникла такая необходимость, полагаю, объяснять излишне да большинству и не интересно.

Для хранения создаю отдельную таблицу и туда пишу REFERER, URI, REMOTE_IP ну и т.д. Когда кто-то заходит на сайт, прямо из core думаю делать соответствующую запись. Но насколько это хорошо с точки зрения производительности? Придет ко мне, допустим, поисковик и начнет запрашивать с бешеной скоростью станицы. И на каждый-каждый запрос будет происходить соединение с СуБД + запись строки.

Стоит ли обращать на это внимание? И отразится ли в реальной жизни?

P.s. Да, я performance geek. wink.gif
kaww
Цитата (paul85 @ 20.04.2014 - 02:18)
на каждый-каждый запрос будет происходить соединение с СуБД
, думаю, что соединение в любом случае будет установлено, чтобы получить данные для вывода на сайте. А вот при высокой посещаемости (частоте записи в лог) могут возникнуть тормоза (для mysql ) на таблицах myisam т.к. при записи накладывается блокировка (write lock) на всю таблицу. В этом случае можно писать в несколько временных таблиц и периодически сливать в одну.
vagrand
paul85
Цитата
Назрела необходимость хранить/собирать статистику посещений серверными инструментами. То есть не популярными JS сценариями от Yandex или Google.


А в чем выражена эта необходимость? У гугла например есть обалденное API, позволяющее получать собранную статистику.

_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
paul85
Цитата (kaww @ 20.04.2014 - 06:55)
В этом случае можно писать в несколько временных таблиц и периодически сливать в одну.

Временная таблица, которая в ОП висит? Или самая обычная таблица, только небольшого размера, которую чистить периодически?

А в случае InnoDB будет ли разница во времени, если добавляем в таблицу с огромным кол-вом строк? Ключи использовать не планирую, по идее не с чего вроде бы...

Цитата (vagrand @ 20.04.2014 - 08:38)
А в чем выражена эта необходимость?

Что за API, я может быть не слышал? Необходимость в том, чтобы определять более точно нагрузку и количество посетителей. У меня сейчас стоят обыкновенные JS счетчики от яндекса и гугла. Юмор в том, что они показывают различные значения. Вот еще одна причина по которой хочется самому собирать статистику. Да и роботы не компилируют JS обычно...

Вот я посидел, подумал и пришел к выводу, что кроме меня мою же статистику никто и никогда более точно не узнает. =)
FatCat
Цитата (paul85 @ 20.04.2014 - 05:18)
Для хранения создаю отдельную таблицу и туда пишу REFERER, URI, REMOTE_IP ну и т.д. Когда кто-то заходит на сайт, прямо из core думаю делать соответствующую запись.

ИМХО, нерационально сваливать в таблицу то, что апач пишет в акцесслогах.

Я у себя делаю иначе.
Сессия привязывается к айпишнику (для гостя) или к айдишнику (для зарегистрированного) и хранится сутки. В рамках сессии по айпишнику собираются интересующие меня данные: реферал первого захода и если есть текст поискового запроса, то текст запроса; страница входа; суммарное время, проведенное на ресурсе (при неактивности больше 15 минут интервал не засчитывается); количество просмотренных страниц.
То есть, даже если посетитель просмотрел 100500 страниц, в базе будет лишь одна строка.

Таким образом, у меня 2 таблицы: таблица сессий, в которой при каждой генерации страницы обновляется информация; и таблица логов, в которой есть только итоговые данные по каждому посетителю.

_____________
Бесплатному сыру в дырки не заглядывают...
inpost
paul85
Я делал так, при тысячах посещений нагрузки от 1 лишнего запроса - незначительно.
Но убрал, когда занимался рефакторингом. При рефакторинге, чтобы 1 сервер выдерживал лимит (не пришлось второй брать) много разных операций сделал включая убрал этот лишний запрос. Посещения пусть считают внешние сервера (статистика от гугла).

При разработке чатов РЕКОМЕНДУЮ сделать на своем сервере подобное. Желательно с привязкой по IP или пользователю. Много интересного узнаешь.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
paul85
Цитата (FatCat @ 20.04.2014 - 20:48)
ИМХО, нерационально сваливать в таблицу то, что апач пишет в акцесслогах.

Согласен, но его логи довольно сложно парсить из-за неоднородной структуры.

Цитата (FatCat @ 20.04.2014 - 20:48)
Сессия привязывается к айпишнику (для гостя) или к айдишнику (для зарегистрированного) и хранится сутки.

То есть идентификатором сессии служит либо IP либо ID? А что происходит в момент обнуления сессий? То есть если в момент Х кто-то сидит на сайте, то его "история" будет разбита на 2 независимых отрезка.

2 таблицы, я так понимаю, архивная и текущая?

Цитата (inpost @ 20.04.2014 - 21:14)
Посещения пусть считают внешние сервера (статистика от гугла).

php-ga? JS сенсоры меня не устраивают из-за JS (пардон). Таскать за собой php-ga, не знаю, может быть это потяжелее собственных разработок будет...
S.Chushkin
Цитата (paul85 @ 20.04.2014 - 20:29)
А в случае InnoDB будет ли разница во времени, если добавляем в таблицу с огромным кол-вом строк? Ключи использовать не планирую, по идее не с чего вроде бы...

- скоростя InnoDB - многие тысячи в секунду
- у такой таблицы от числа записей - не будет, практически. Изредка может подтормаживать при расширении файла БД, но это вопрос не к движку, а к диску.

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
S.Chushkin
Цитата (paul85 @ 21.04.2014 - 05:10)
Согласен, но его логи довольно сложно парсить из-за неоднородной структуры.

Не сложно. Обычная регулярка. Причём, регулярка даёт порядка 30К строк в сек. Тем более, сильно сомневаюсь, что у вас структура логов меняется чаще, чем раз в несколько лет.
п.с.
Правда, там, в парсере строк апач-логов, будут другие заморочки. В общем, мне в своё время не удалось добиться больше 10К строк/сек. В своё оправдание скажу, что там был сложный парсер с анализом полученных данных, подсчётом статистики и пр. и записью результатов в БД.

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
SlavaFr
Статистика нужна не так и срочно и может спокойно подождать.
Скрипт который читает раз в день апачелог и забивает содержимое в специальную таблицу для последующего анализа не будет напрягать систему и может производиться физически на другой машине и другой базе данных.

_____________
↓↓↓↓↓↓↓↓↓↓
ответ может быть здесь
или в mysql_error();
paul85
Цитата (S.Chushkin @ 22.04.2014 - 01:02)
Не сложно. Обычная регулярка. Причём, регулярка даёт порядка 30К строк в сек.

Может быть вы тогда поделитесь регулярочкой? А лучше скриптом, который разложит лог в таблицу вида (хотя бы):

IP | REFERER | URL | TIME

Картинки, CSS и файлы JS учитывать не нужно. Обработанные ошибки тоже.

S.Chushkin
Цитата (paul85 @ 22.04.2014 - 19:33)
Может быть вы тогда поделитесь регулярочкой? А лучше скриптом, который разложит лог в таблицу вида (хотя бы):

Нет, не поделюсь. Проект коммерческий. Это во-первых. И во-вторых, там сложно, как уже говорил, "выдернуть" быстро и просто не получится.
Например, для "стандартной" строки лога регулярка будет что-то вроде:

формат лога: '%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"'
регулярка: '/(.*)\s+(.*)\s+(.*)\s+\[(.*)\]\s+"(.*)"\s+(.*)\s+(.*)\s+"(.*)"\s+"(.*)"(?:\s|$)/U'
А дальше ещё порядка 100 строк кода, анализирующие и окончательно разбирающие полученные данные. А затем ещё пару сотен, анализа и сбора статистики.
Надеюсь, сами разберётесь с этим - там не сложно, в принципе, но гиморно. Особенно со скоростями. :)



_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.