пятница, 1 июля 2011 г.

Scribe - сервер логирования в реальном времени

Не давно я запустил в продакшене приложение для сбора статистики прочтений авторских материалов и расчёта гонорара. Собственно счётчик показов был стандартный JavaScript + img. На стороне сервера данные фиксируются в лог-файле и раз в час производится обработка логов.
Исходя из особенностей обработки статистики и удобства работы с логами к ним предъявлялись следующие требования:
  • логи должны ротироватся ровно в полночь
  • в имени лог-файла должна быть соответствующая дата
  • в лог можно писать одновременно из нескольких процессов
Первые два пункта без проблем решаются стандартными средствами питоновского модуля logging и хендлера TimedRotatingFileHandler. А вот для того, что бы реализовать третий пункт треубется специальный, отдельно запущенный сервер логирования (есть конечно варианты реализации с использованием модуля multiprocessing, но мне этот вариант не нравится).


В мире *nix-подобных систем своеобразным стандартом сервера логирования является syslog и его модификации. В стандартном варианте syslogd полностью следует unix way - делать одну работу, но очень хорошо. Т.е. он просто пишет в лог файл то, что ему присылают и более ничего не умеет. Есть конечно отдельные утилиты для ротации логов, но я как то не осилил разобраться с ними, что бы они делали то что мне нужно. Да и настраивать портянку из нескольких утилит мне было несколько напряжно. А если ещё учесть, что в разных операционках/дистрибутивах используются по умолчанию разные сервисы логирования с разными возможностями и настройками, то становится совсем не уютно.

В поисках подходящего решения я натолкнулся на разработку Facebook - Scribe. Он просто идеально подходил для моих целей.

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

Scribe поддерживает несколько типов хранилищ (store). Также он может распределять сообщения между разными хранилищами в зависимости от хеша или случайно. Можно дублировать сообщения сразу в несколько хранилищ.
При использовании в качестве хранилища файлов, Scribe может сам выполнять ротацию используя комбинацию следующих ограничений:
  • период ротации (час, день, неделя или произвольный промежуток времени)
  • час дня для ротации (в случае если период - день)
  • минута для ротации (в случае если период - час или день)
  • максимальный размер файла
При этом в имени файла сохраняется дата.

Таким образом Scribe удовлетворял всем трём  моим требованиям.
Осталось только его установить. В FreebBSD Scribe 2.2 имеется в портах, а вот на моей рабочей машине с Ubuntu его нету. Если тупо следовать инструкции по установке из исходников, то скорее всего у вас ничего не получится с первого раза. Хотя бы по той причине, что в документации указанно, что ему требуется Thrift 0.5.0+, а на самом деле у меня он нормально собрался только с версией 0.4.0 (в FreeBSD кстати именно эта версия и используется).

Для упрощения установки Scribe я сделал конфигурацию для zc.buildout, которая позволяет собрать сервер и использовать его даже не имея рутовых прав (за исключением установки зависимостей, которые имеются в любом дистрибутиве).

Скачать конфигурацию для установки Scribe можно здесь.

PS:
Благодаря Scribe  я узнал про такую классную штуку как Thrift (тоже разработка Facebook). И возможно воспользуюсь ей при разработке приложений типа клиент-сервер.

Комментариев нет:

Отправить комментарий