前提
本来であればflask、nginxに加えuwsgiサーバを立てるのが良いのは認識しているが、現状の構成からできることを行なった結果である。
背景
Docker上のFlask + Nginxのサーバを立てたのだが、Flaskのログがファイル出力のみされており、docker runを行なったプロンプトやdocker logsで確認ができない。どうにかしてできるようにしたい。
現状の構成
かなり省略するが、次の通り。
FROM centos:centos7
CMD ["/bin/bash", "./start.sh"]
# !/bin/bash
uwsgi --ini=uwsgi.ini
nginx -g "daemon off;"
daemonize = /var/log/uwsgi/uwsgi.log
上記の状態だとuwsgiプロセスがデーモン化して動作し、フォアグラウンドジョブとしてNginxが動作する。
そして、ログはdaemonizeで指定した/var/log/uwsgi/uwsgi.logに全て出力されてしまう。
対応
いくつか対応を試みたがうまくいかず、結果的に3番目の対応方法でうまくいった。
flask上でコンソール出力を明示的に追加
すでにコンソール出力はされているとは思いながら、追加でコンソール出力のストリームを追加することでできないか確認。
logger.addHandler(logging.StreamHandler())
しかし、daemonizeは標準出力されるものをファイルに流すようで、追加したストリームの内容もファイルに出力されてしまった。
daemonizeの設定を/dev/stdout に設定
daemonizeは指定したファイルに標準出力・エラー出力を出力してくれるのだが、あえて/dev/stdoutに出力することで標準出力にできないかと試みた。
コンソール出力へはうまく出力ができたが、flaskのログローテーション機能が当該ファイルをチェックにいき、絶えずエラーメッセージが出てしまう。
ログローテーション機能を抑止する方法を探したが、見つからずに断念。
uwsgi_check_logrotate()/lseek(): Illegal seek [core/logging.c line 494]
ログファイルをtailで監視
起動シェル上でtailによる監視を追加。
ファイルにもコンソールにもログが出力できることを確認。start.shとuwsgi.ini両方で出力ファイルを合わせる必要があるが、とりあえずできた。
# 追加部分
touch /var/log/uwsgi/uwsgi.log
tail -F /var/log/uwsgi/uwsgi.log > /dev/stdout &
uwsgi --ini=uwsgi.ini
nginx -g "daemon off;"