【gunicorn】logの設定について
gunicornのlog設定をいじったので忘備録。
1. logの基本設定
gunicornはデフォルトの状態ではlogを吐き出してくれない 。
なので、設定ファイルを作成して出力をonにしてあげなければいけない。
gunicorn_setting.py
# access log accesslog = 'logを出力したいディレクトリ' access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"' # gunicorn log errorlog = 'logを出力したいディレクトリ' loglevel = 'debug'
※loglevelは debug
、info
、warning
、error
、critical
から選択可能
2.logの抑制
下記のコマンドでgunicornを起動する。
$ gunicorn --config /path/path/gunicorn_settings.py
これでlogは出力できるようになったが、AWS上で開発環境を構築しているため、
ELBヘルスチェッカーのlogがaccesslogに常に出力され続けてうっとおしい…。
logの細かい制御は、gunicornがデフォルト持っているgloggingを継承してclassを作成し、
logger_classに渡してやればカスタムができるらしいので、設定ファイルに以下を追記。
gunicorn_setting.py
# logのフィルタリング設定 import logging from gunicorn import glogging class CustomGunicornLogger(glogging.Logger): def access(self, resp, req, environ, request_time): # ELB-HelthCheckerのログを除外 if "ELB-HealthChecker" not in environ['HTTP_USER_AGENT']: super().access(resp, req, environ, request_time) logger_class = 'config.gunicorn_setting.CustomGunicornLogger'
これでELBヘルスチェッカーのログは出力されなくなった。
3.logのローテーション
gunicornにはログローテーションの設定はデフォルトで存在しないので、
pythonのloggingを使って制御するか、osのlogrotatedを使うらしい。
調べたところ、logrotatedを使うほうが圧倒的に設定が楽なので、
/etc/logrotated/conf/に設定ファイルを作成。
/logファイルの存在するpath/ { daily rotate 3 copytruncate compress missingok su root root }
はじめはcreate
でオプションを設定していたが、うまくローテーションが実行されなかった。
create
で新規ファイルを作成すると、作成されたファイルではなくローテーション先の
ファイルにlogを追記するという挙動が起きてしまった。
詳しいことは分からないが、gunicornは新規生成したファイルには同名であっても追記してくれないようだ。
su root root
は権限設定によっては、必要となるオプション。
$ sudo /usr/sbin/ logrotate -d /etc/logrotate.d/作成したlogrorotateの設定ファイル
を実行してみて、permissions errorが発生したらユーザーとグループを指定してあげるか、 ディレクトリそのものの権限設定を変更する必要があるらしい。