web-dev-qa-db-ja.com

監視対象のログに出力が表示されない

私は[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
25
zubinmehta

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)
37
Martijn Pieters

次のようにプログラムを実行できます。

python -u file.py

これにより、バッファなしの出力が生成されます

43

pythonベースのスクリプトで、通常のベースで出力をフラッシュするように変更できない、または変更したくない場合は、Expectパッケージの nbuffer を使用できます。 。

Django Dockerコンテナー内のアプリケーションの場合、最近このように使用しました(supervisordから実行されたシェルスクリプトから)):

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