У меня есть приложение 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.*
РЕДАКТИРОВАТЬ (решено) :
Таким образом, выясняется, что возникли две проблемы:
- Поскольку 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.