Журналы супервизора не показывают мой вывод
У меня есть [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
Ответы
Ответ 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