私は[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
Pythonの出力はバッファリングされます。 環境変数PYTHONUNBUFFERED=1
をsupervisord.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)
次のようにプログラムを実行できます。
python -u file.py
これにより、バッファなしの出力が生成されます
pythonベースのスクリプトで、通常のベースで出力をフラッシュするように変更できない、または変更したくない場合は、Expectパッケージの nbuffer を使用できます。 。
Django Dockerコンテナー内のアプリケーションの場合、最近このように使用しました(supervisordから実行されたシェルスクリプトから)):
unbuffer python -u manage.py runserver 0.0.0.0:11000 2>&1 >> /var/log/Django.log