Подтвердить что ты не робот

Журналы супервизора не показывают мой вывод

У меня есть [program: x], и он печатает /sys.stdout.writes многое. Ни один из них не появляется ни в AUTO childlogdir [supervisord], ни в файле stdout_log файла [program: x] Я что-то пропустил?

Как я могу записать все, что напечатано или выведено из [program: x]?

В моей программе я явно делаю обе,

print "something"
sys.stdout.write("something") 

Соответствующий файл supervisord.conf

[supervisord]
childlogdir = %(here)s/../logs/supervisord/
logfile = %(here)s/../logs/supervisord/supervisord.log
logfile_maxbytes = 100MB
logfile_backups = 10
loglevel = info
pidfile = %(here)s/../logs/supervisord/supervisord.pid
umask = 022
nodaemon = false
nocleanup = false

[program:x]
directory = %(here)s/../
command = python file.py
autostart=true
autorestart=true
redirect_stderr=true  
stdout_logfile = /appropriate-path/to/access.log
4b9b3361

Ответ 1

Выход Python буферизируется, убедитесь, что вы сбросили обработчик sys.stdout, чтобы увидеть сообщения журнала раньше:

sys.stdout.flush()

В python 3.3 и выше вы можете добавить параметр flush=True, чтобы функция сделала это для вас:

print(something, flush=True)

Ответ 2

Вы можете запустить свою программу следующим образом:

python -u file.py

это приведет к созданию небуферизованного выхода

Ответ 3

Если у вас есть python на основе script, который вы не можете или не хотите изменять, чтобы вывести вывод на регулярной основе, вы можете использовать unbuffer из пакета Expect.

Для приложения Django в контейнере докеров я в последнее время использовал его (из оболочки script run from supervisord):

unbuffer python -u manage.py runserver 0.0.0.0:11000 2>&1 >> /var/log/django.log