UWSGI не перенаправляет стандартный вывод приложения на стандартный вывод, только в файл - PullRequest
2 голосов
/ 06 марта 2019

У меня есть приложение Flask, запущенное внутри контейнера, где я настроил ведение журнала с помощью StreamHandler(), поэтому журналы отправляются на стандартный вывод.
Когда мой файл uwsgi.ini содержит инструкцию для перенаправления журналов вфайла (с помощью logto), то журналы из приложения доступны в файле журнала, смешанном с журналами uWSGI (как и ожидалось).

Но когда я удаляю logto изuwsgi.ini - поскольку я хочу, чтобы эти журналы отправлялись в стандартный контейнер Docker, только журналы uWSGI видны в журналах контейнера Docker, журналы приложений - нет.(журналы uWSGI существовали и раньше)

uwsgi.ini:

[uwsgi]
base = /app_home/app
wsgi-file = /app_home/app/wsgi.py
callable = app
socket = /tmp/uwsgi.sock
chmod-socket    = 666
# Log directory - we needed this to be turned off, so the logs are sent to STDOUT
# logto = /var/log/uwsgi/app.log
vacuum = true
master = true
processes = 3
enable-threads = true
uid = app
gid = app
master-fifo = /tmp/fifo0
master-fifo = /tmp/fifo1

chdir = /app_home/app

Когда logto включен, тогда файл журнала включает в себя журналы приложения (как и должно быть):

[2019-03-05 17:19:05,415] INFO in __init__: Initial starting of app...
2019-03-05 17:19:05,415 (9) - INFO - Initial starting of app...- [in ./app/__init__.py:128, function:create_app]
WSGI app 0 (mountpoint='') ready in 1 seconds on interpreter 0x1ad49b0 pid: 9 (default app)
*** uWSGI is running in multiple interpreter mode ***
gracefully (RE)spawned uWSGI master process (pid: 9)
spawned uWSGI worker 1 (pid: 32, cores: 1)

После того, как logto будет отключен, не будет никакого файла журнала (как и ожидалось), но и никаких журналов приложений в журнале контейнера Docker.Контейнер Docker выглядит точно так же, как и раньше:

2019-03-05T22:19:09.956784133Z 2019-03-05 17:19:09,956 CRIT Supervisor running as root (no user in config file)
2019-03-05T22:19:09.959701644Z 2019-03-05 17:19:09,959 INFO supervisord started with pid 1
2019-03-05T22:19:10.961366502Z 2019-03-05 17:19:10,961 INFO spawned: 'nginx' with pid 9
2019-03-05T22:19:10.963312945Z 2019-03-05 17:19:10,962 INFO spawned: 'uwsgi' with pid 10
2019-03-05T22:19:12.928470278Z 2019-03-05 17:19:12,928 INFO success: nginx entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2019-03-05T22:19:12.928498809Z 2019-03-05 17:19:12,928 INFO success: uwsgi entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)

Документация uWSGI показывает, что журналы отправляются в stdout / stderr по умолчанию (см. https://uwsgi -docs.readthedocs.io / en /latest / Logging.html ), поэтому я не вижу причины, по которой журналы приложения не будут отправляться на стандартный вывод с собственными журналами uWSGI, а будут отправлены в файл с logto.

* 1027.* РЕДАКТИРОВАТЬ (решено) :
Таким образом, выясняется, что возникли две проблемы:
  1. Поскольку uWSGI работает в контейнере Docker с Supervisor, мне нужно сделатьперенаправить стандартный вывод uwsgi на стандартный вывод.
    supervisord.conf:
[program:uwsgi]
command=/usr/local/bin/uwsgi --ini /app_home/app/uwsgi.ini --uid app --gid app --log-master
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0

Хотя это работало с другими приложениями (такими как NGinx), этого было недостаточнодля uWSGI см. шаг № 2:

В uWSGI необходимо было добавить специальный флаг (--log-master), чтобы делегировать ведение журнала главному процессу:
[program:uwsgi]
command=/usr/local/bin/uwsgi --ini /app_home/app/uwsgi.ini --uid app --gid app --log-master
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0

И еще, журналы отприложения Flask видны в журнале контейнера Docker.

...