Docker Composeによって管理されるDockerコンテナー内で実行されるPythonアプリでprint()
ステートメントを使用すると、sys.stderr
出力のみがログに記録されます。Vanillaprint()
ステートメント見られないので、これ:
print("Hello? Anyone there?")
...通常のログには表示されません:
(私のアプリの他のライブラリによって明示的に出力された他のログを見ることができますが、私自身の呼び出しはありません。)
print()
呼び出しが無視されないようにするにはどうすればよいですか?
デフォルトでは、Pythonはsys.stdout
への出力をバッファリングします。
いくつかのオプションがあります。
1。明示的なflush
を呼び出します
次のように、flush=True
キーワードを含めるように元のprintステートメントをリファクタリングします。
print("Hello? Anyone there?", flush=True)
注:これにより、同じ印刷呼び出しだけでなく、entireバッファーがフラッシュされます。したがって、明示的にバッファリングされていない「裸の」印刷関数呼び出しが他の場所(つまりflush=True
なし)にある場合、これらも常にフラッシュされます。
あなたは同じことを達成できます:
import sys
sys.stdout.flush()
このオプションは、フラッシュが発生するwhenを最大限に制御する場合に役立ちます。
2。PYTHONUNBUFFERED
env varを使用してアプリ全体をバッファリング解除します
以下をdocker-compose.yml
ファイルのenvironment
セクションにドロップします。
PYTHONUNBUFFERED: 1
これにより、stdout
へのすべての出力がすぐにフラッシュされます。
。実行python with -u
上記のオプション#2と同様に、これにより、アプリの実行期間全体でPythonが 'unbuffered'で実行されます。python -u <entrypoint.py>
で実行するだけです-環境変数は不要です。
Dockerfileの実行行にオプション-uを追加すると、ログが出力されます。
CMD ['python', '-u', 'my_python_script.py']