Docker, Supervisord и протоколирование - как консолидировать журналы в журналах докеров?

Итак, экспериментируйте с приложением Docker + Supervisord + Django через uWSGI. У меня весь стек работает нормально, но нужно убрать регистрацию.

Если я запускаю диспетчер в режиме без демона,

/usr/bin/supervisord -n

Затем я получаю вывод журнала для супервизора, который воспроизводится в протоколе stdout docker. Однако, если supervisord находится в режиме демона, его собственные журналы сбрасываются в файловой системе контейнера, а журналы его приложений тоже - в их собственных файлах app__stderr/stdout.

То, что я хочу, - это зарегистрировать как супервизор, так и приложение stdout в журнале докеров.

Начинает ли супервизор в не-демонах разумную идею для этого или вызывает непредвиденные последствия? Кроме того, как мне получить журналы приложений, которые также воспроизводятся в журналах докеров?

Ответ 1

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

В контейнере можно использовать что-то самоорганизующееся, например logstash, чтобы собирать журналы и отправлять их на центральный сервер. Или используйте коммерческую услугу, такую ​​как loggly или papertrail, чтобы сделать то же самое.

Ответ 2

Я сделал это с помощью.

Установите supervisor-stdout в изображении Docker:

RUN apt-get install -y python-pip && pip install supervisor-stdout

Конфигурация супервизора

Измените свой supervisord.conf так:

[program:myprogram]
command=/what/ever/command
stdout_events_enabled=true
stderr_events_enabled=true

[eventlistener:stdout] 
command = supervisor_stdout 
buffer_size = 100 
events = PROCESS_LOG 
result_handler = supervisor_stdout:event_handler

Ответ 3

Докер-контейнер похож на kleenex, вы его используете, а затем бросаете. Чтобы быть "живым", Docker нуждается в чем-то, работающем на переднем плане (тогда как демоны работают в фоновом режиме), поэтому вы используете Supervisord.

Таким образом, вам нужно выполнить "переадресацию/добавление/объединение" процесса (доступ и ошибка) к выходу Supervisord, который вы видите при запуске вашего контейнера.

Как сказал Дрю, каждый использует https://github.com/coderanger/supervisor-stdout для его достижения (для меня это должно быть добавлено в проект супервизора!). Что-то Дрю забыло сказать, вам может понадобиться добавить

stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0

В блок конфигурации программы супервизора.

Что-то очень полезное, представьте, что ваш процесс регистрируется в файле журнала вместо stdout, вы можете попросить supervisord просмотреть его:

[program:php-fpm-log]
command=tail -f /var/log/php5-fpm.log
stdout_events_enabled=true
stderr_events_enabled=true

Это приведет к перенаправлению содержимого php5-fpm.log в stdout, затем в stdout supervisord через superisord-stdout.

Ответ 4

supervisor-stdout требует установки python-pip, который загружает ~ 150mb, для контейнера, я думаю, это просто для установки другого инструмента.

Перенаправление файла журнала в /dev/stdout работает для меня:

stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0

http://veithen.github.io/2015/01/08/supervisord-redirecting-stdout.html

Ответ 5

Сегодня самая лучшая практика - иметь минимальные изображения Докера. Для меня идеальный контейнер с приложением Python содержит только мой код, поддерживающие библиотеки и что-то вроде uwsgi, если это необходимо.

Я опубликовал одно решение на https://github.com/msgre/uwsgi_logging. Это просто приложение Django за uwsgi, которое настроено для отображения журналов из uwsgi и приложения Django на контейнерах stdout без необходимости supervisor.

Ответ 6

В самом деле, самое лучшее решение - запуск супервизора в не-демоном режиме.

Вы также можете использовать тома, чтобы монтировать журналы супервизора в центральное место.