Наверное, каждый, кому когда-нибудь приходилось следить одновременно за большим количеством окошек с логами, подумывал о переносе некоторых из них на экран планшета или телефона.
А, находясь далеко от компьютера, следить за выхлопом недавно запущенного большого и страшного сервиса?
Конечно, можно поставить 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 произошёл какой-то косяк, перезалил картинки к себе.
Автор: nvbn