28

我有一个 [program:x] 正在运行,它会打印 / sys.stdout.writes 很多东西。[supervisord] 的 AUTO childlogdir 或 [program:x] 的 stdout_logfile 中都没有出现我错过了什么吗?

如何捕获从 [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
4

3 回答 3

53

Python 输出被缓冲。在您中设置环境变量PYTHONUNBUFFERED=1supervisord.conf将禁用缓冲并更快地显示日志消息:

[program:x]
environment = PYTHONUNBUFFERED=1

或将-u命令行开关添加到python命令:

[program:x]
command = python -u file.py

或者,您可以显式刷新sys.stdout处理程序:

sys.stdout.flush()

在 python 3.3 及更高版本上,您可以添加flush=True参数以让函数为您执行此操作:

print(something, flush=True)
于 2012-12-19T15:54:01.290 回答
48

你可以像这样运行你的程序:

python -u file.py

这将产生无缓冲的输出

于 2013-07-31T04:19:52.070 回答
1

如果您有基于 python 的脚本,但您不能或不想更改为定期刷新输出,那么您可以使用Expect 包中的unbuffer

对于 docker 容器中的 Django 应用程序,我最近使用它(从 supervisord 运行的 shell 脚本):

unbuffer python -u manage.py runserver 0.0.0.0:11000 2>&1 >> /var/log/django.log
于 2017-10-13T12:05:50.867 回答