"も"日記

思考整理のためにいろいろ書き殴っていきます

【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は debuginfowarningerrorcritical から選択可能

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が発生したらユーザーとグループを指定してあげるか、 ディレクトリそのものの権限設定を変更する必要があるらしい。