Назад | Перейти на главную страницу

Nginx: как использовать сборщик логов докеров, когда nginx работает под супервизором

Официальный образ докера nginx (Dockerfile) использует следующий трюк, чтобы передать свои журналы в stdout и stderr, чтобы они были захвачены сборщиком журналов докеров и доступны для просмотра с помощью docker logs <container-name>:

# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log
RUN ln -sf /dev/stderr /var/log/nginx/error.log

Я хочу сделать то же самое, но у меня есть руководитель как PID 1 в моем контейнере, и он контролирует процесс nginx, захватывает stdout и stderr и помещает их в собственный файл журнала. Следовательно, журналы не достигают сборщика журналов Docker.

Вот соответствующий блок в моем supervisord.conf

[program:nginx]
command=/usr/sbin/nginx -g "daemon off;"
priority=990
; NOTE: We do not want to redirect stdout and stderr of a nginx process to a logfile because we want docker log collector to get them.
stdout_logfile= NOT SURE WHAT TO PUT HERE?
stderr_logfile= NOT SURE WHAT TO PUT HERE?
username=www-data
autorestart=true

Документы супервайзера отличные (http://supervisord.org/configuration.html) но для stdout_logfile они не дают мне нужного ответа, а именно, как мне настроить supervisord, чтобы он не перехватывал процессы stdout / stderr (или для записи в файл журнала, но также перенаправлял на обычный stdout / stderr).

Что я уже пробовал:

  1. stdout_logfile=NONE - Не получать логи ни в стандартный вывод, ни в файл
  2. stdout_logfile=/var/log/supervisor/%(program_name)s.log - Получить журналы в файл, но не в стандартный вывод.
  3. Не определяя stdout_logfile - Получать журналы в файл со случайным именем, но не в стандартный вывод.
  4. stdout_logfile=/dev/stdout - Супервайзер выдает ошибку:

    CRIT исключение uncaptured python, закрытие канала (stdout)> (: [Errno 29] Illegal seek [/usr/lib/python2.7/dist-packages/supervisor/supervisord.py|runforever|233] [/ usr / lib / python2 .7 / dist-packages / supervisor / dispatchers.py | handle_read_event | 231] [/usr/lib/python2.7/dist-packages/supervisor/dispatchers.py|record_output|165] [/usr/lib/python2.7 /dist-packages/supervisor/dispatchers.py|_log|141] [/usr/lib/python2.7/dist-packages/supervisor/loggers.py|info|273] [/usr/lib/python2.7/dist -packages / supervisor / loggers.py | журнал | 291] [/usr/lib/python2.7/dist-packages/supervisor/loggers.py|emit|186] [/usr/lib/python2.7/dist-packages /supervisor/loggers.py|doRollover|195])

В Illegal seek ошибка вызвана кодом в супервизоре, который отвечает за ротацию файла журнала. Чтобы перенаправить на stdout / stderr, вам необходимо отключить ротацию файлов журнала, как описано здесь:

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