Pull to refresh

Осовремененный Unix Way или pipe в браузер

Reading time2 min
Views3.6K
Наверное, каждый, кому когда-нибудь приходилось следить одновременно за большим количеством окошек с логами, подумывал о переносе некоторых из них на экран планшета или телефона.
А, находясь далеко от компьютера, следить за выхлопом недавно запущенного большого и страшного сервиса?
Конечно, можно поставить ssh клиент на телефон, но это не особо удобно.
Поэтому я решил сделать мини-сервис упрощающий «удалённый» просмотр логов.




Краткое резюме


Сервис cantail.me с открытым исходным кодом, выложенным на github.
Свободный консольный клиент (github). Для простой отправки данных достаточно:
long-runnig-app | tailme

И скопировать ссылку из открывшегося окна браузера. Или можно добавить параметр -s и просто скопировать её из терминала.

Для примера сейчас запущена публикация лога nginx'а командной:
tail -f /var/log/nginx/cantailme.access.log | tailme -s


Установка клиента


В ubuntu 11.10+ приложение можно установить из ppa:
add-apt-repository ppa:nvbn-rm/ppa
apt-get update
apt-get install tailme

В других дистрибутивах можно установить через pip:
pip install -e git+https://github.com/nvbn/cantailme-client.git#egg=tailme

Либо через установочный скрипт:
git clone https://github.com/nvbn/cantailme-client.git
cd cantailme-client
python setup.py install


Под капотом




Реализация клиента очень простая — цикл читающий stdin и отправляющий на сервер новые строчки.
Для предотвращения подмены данных сервер при инициализации сессии отдаёт хеш-идентификатор и «секрет», которые в дальнейшем используются для отправки «строк».

Серверная часть немного сложнее, её можно разделить на 3 условных сущности:
  • http «сервер» занимающийся рендеренгом 2 вьюх;
  • jsonrpc api, с помощью которого консольный клиент инициализирует сессию и отправляет данные на сервер;
  • push сервер для отправки полученных через api строк клиентам в реальном времени.


Взаимодействие между частями системы проходит при помощи RabbitMQ.
Push работает через tornado-sockjs.
Для экономии ресурсов логи загружаются сразу в файл и отдаются через nginx, минуя django.
Для желающих залить /dev/urandom или большие логи раз в 5 минут запускается «суровый» скриптик.

Деплой




В данном случае он нетривиален, но я уже сталкивался с похожей ситуацией. Основные причины выбора такой схемы:
  • нередка ситуация, когда нестандартные порты порезаны, поэтому tornado и django должны висеть на одном стандартном порту;
  • заставить nginx работать нормально с WebSocket'ами проблематично;
  • HAProxy не раздаёт статику;
  • эту схему я успел погонять в продакшене на неэкспериментальных проектах =)


В случае возникновения ошибок пишите багрепорты в трекере для сервера и клиента. Либо в комментариях к этому посту =)

PS с habrastorage произошёл какой-то косяк, перезалил картинки к себе.
Tags:
Hubs:
+59
Comments35

Articles

Change theme settings