Armadilloフォーラム

コンテナ動作中にログを取得する方法について

takada_yasuhiro

2022年10月14日 9時54分

お世話になっております。
Podmanのコンテナ側で標準出力にログを出力すると、ホスト側の
podman logs <コンテナ名>
でログを取得できる想定です。(/etc/atmark/containers/による自動起動であれば、この方法が通常かと思います)
しかし、自動起動または podman run -dで起動したコンテナのログは上記の方法では空でした。(バッファリングされている状態と想像してます)
コンテナを終了するとログは取得できましたが、動作中のログを取得できません。
マニュアルにはログのプラクティスが見当たりませんでしたが、動作中のログを収集する方法はあるのでしょうか。

コメント

入江です。

> しかし、自動起動または podman run -dで起動したコンテナのログは上記の方法では空でした。(バッファリングされている状態と想像してます)
> コンテナを終了するとログは取得できましたが、動作中のログを取得できません。

こちら、当方で同様の現象が再現できませんでした。

申し訳ございませんが、最小構成で現象が再現できる手順を教えていただけま
すでしょうか。

お世話になっています。

自己解決しました。
こちらで再現した時は下記の状況でした。(-dの代わりに -itを指定すれば、1秒間隔で時刻が表示されます。)

# NG
armadillo:~# podman run -d --name=log_test_py docker.io/library/python:3.10-slim-bullseye python3 -c "
> import time
> from datetime import datetime
> while True:
>     print(f'{datetime.now()}')
>     time.sleep(1)
> "
armadillo:~# sleep 5
armadillo:~# podman logs log_test_py
armadillo:~# podman stop log_test_py
WARN[0010] StopSignal SIGTERM failed to stop container log_test_py in 10 seconds, resorting to SIGKILL
log_test_py
armadillo:~# podman logs log_test_py
armadillo:~#

/bin/shで同様のことを行うとpodman logsでログが出力されることから、python側の問題であると推測されます。
インターネットで同様の事象を探すと(dockerの事象として)該当するものがありました。

pythonのコマンドラインオプションで-u を指定するか、環境変数PYTHONUNBUFFERED を定義することで、ログが出力されるようになりました。
https://docs.python.org/ja/3/using/cmdline.html#cmdoption-u

お騒がせしました。