LoginSignup
6
4

More than 3 years have passed since last update.

Docker上のFlask + Nginxでコンソールにログを出力する

Posted at

前提

本来であればflask、nginxに加えuwsgiサーバを立てるのが良いのは認識しているが、現状の構成からできることを行なった結果である。

背景

Docker上のFlask + Nginxのサーバを立てたのだが、Flaskのログがファイル出力のみされており、docker runを行なったプロンプトやdocker logsで確認ができない。どうにかしてできるようにしたい。

現状の構成

かなり省略するが、次の通り。

Dockerfile
FROM centos:centos7

CMD ["/bin/bash", "./start.sh"]
start.sh
# !/bin/bash

uwsgi --ini=uwsgi.ini
nginx -g "daemon off;"
uwsgi.ini
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両方で出力ファイルを合わせる必要があるが、とりあえずできた。

start.sh
# 追加部分
touch /var/log/uwsgi/uwsgi.log
tail -F /var/log/uwsgi/uwsgi.log > /dev/stdout &

uwsgi --ini=uwsgi.ini
nginx -g "daemon off;"
6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4