Back to Blog

Gunicornのログを管理する方法【ログの出力やローテーションなど】

flask

2024年7月14日

こんにちは!

今回の記事では、Gunicornのログを管理する方法について解説します。

Gunicornは、PythonのWSGI HTTPサーバーであり、特にDjangoやFlaskといったフレームワークと組み合わせて使用されることが多いです。

Webアプリケーションを運用する上で重要なのがログの管理です。

今回の記事では、Gunicornのログ管理に焦点を当て、ログの設定方法やローテーションなど、ログ管理に必要な設定を解説します!

そもそもGunicornが何なのかについては、こちらの記事で詳しく解説しています。

【関連】FlaskやDjangoで使われるGunicornとは何か?

Gunicornの標準のログ出力

まずは、Gunicornの標準のログ出力についてみてみましょう。

GunicornでWebアプリケーションが起動するまでの準備を行います。

以下のコマンドを実行して、Gunicornをインストールします。今回は簡単にWebアプリが実装できるflaskを使います。

pip install flask gunicorn

app.pyには、以下のように記述します。

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello, World!"

if __name__ == "__main__":
    app.run()

Gunicornの起動は、以下のコマンドを実行します。

gunicorn app:app

myappはPythonモジュール、appはWSGIアプリケーションオブジェクトです。

Gunicornはデフォルトで標準出力にログを出力します。標準出力とは、以下のようにコンソール上にログが出ることです。

標準のログ出力

開発環境の場合は、上記でも大丈夫です。

しかし、プロダクション環境ではより詳細なログ管理が求められます。例えば、上記の場合はコンソールを抜けた場合はログが見れません。プロダクションは、ログファイルなどに保存する必要があります。

ログファイルに出力する

Gunicornコマンドでは、さまざまなログオプションを提供しています。ログをファイルに出力する場合も、引数で設定します。

–access-logfile

アクセスログの出力先を指定する場合は、「–access-logfile」オプションを指定します。以下のように実行します。

gunicorn myapp:app --access-logfile access.log

–error-logfile

エラーログの出力先ファイルを指定する場合は、「–error-logfile」オプションを指定します。以下のように実行します。

gunicorn myapp:app --error-logfile error.log

もちろん、アクセスログとエラーログの設定を同時にすることも可能です。

gunicorn myapp:app --access-logfile access.log --error-logfile error.log

このようにログファイルの設定を行います。

Gunicornでログレベルの指定

ログレベルとは、ログメッセージの重要度や緊急度を示す分類のことです。

ログレベルを適切に設定することで、システムやアプリケーションの運用状況を効率的に監視・管理できます。

ログレベルの一覧

ログレベルには、以下のようなものがあります。

レベル説明
DEBUG 最も詳細な情報を含むログレベル。主に開発やデバッグ時に使用される。 変数の状態、詳細な処理フローの追跡
INFO通常の動作や重要なイベントに関する情報。システムが正常に動作していることを示す。ユーザーのログイン成功、サービスの起動
WARNING潜在的な問題や注意が必要な状況。システム動作に重大な影響を及ぼさない。ディスク空き容量が少ない、非推奨のAPIの使用
ERRORシステムやアプリケーションの一部が正常に動作していないことを示す。データベース接続失敗、ファイル書き込みエラー
CRITICALシステム全体の動作に深刻な影響を及ぼす問題。緊急の対応が必要。メモリ不足によるシステム停止、重大なセキュリティエラー

開発環境では、DEBUGレベル以上のログを出力して、本番環境では、WARNINGもしくはERROR以上のログを出力することが一般的です。しかし、システムの運用状況に応じて適切なログレベルを出力しましょう。

Gunicornでログレベルを変更する

Gunicornでログレベルを変更する場合は、「–log-level」オプションを使用します。たとえば、ログレベルをinfoに変更する場合は、以下のように実行します。

gunicorn app:app --log-level info

ログのローテーション

Gunicornのログファイルが大きくなりすぎるのを防ぐために、ログローテーションを設定することが重要です。

ログローテーションとは?

ログローテーションとは、ログファイルのサイズが一定の閾値に達したり、一定の期間が経過したりしたときに、新しいログファイルを生成して古いログファイルを保存または削除するプロセスです。

これにより、ログファイルのサイズが肥大化するのを防ぎ、システムのパフォーマンスを維持しやすくなります。

ログローテーションの設定

ログローテーションを実現するためには、logrotateを使用します。これは、Linuxのツールです。

/etc/logrotate.d/gunicornファイルを作成し、以下の内容を追加します。

/var/log/gunicorn/*.log {
    daily
    missingok
    rotate 7
    compress
    delaycompress
    notifempty
    create 640 www-data www-data
    sharedscripts
    postrotate
        [ -f /var/run/gunicorn.pid ] && kill -USR1 `cat /var/run/gunicorn.pid`
    endscript
}

上記の設定では、/var/log/gunicorn/ディレクトリ内の全ての.logファイルをローテーションします。つまり、gunicornコマンドの実行時に、ログファイルの場所を/var/log/gunicorn/ディレクトリに指定しておく必要があります。

また、ログファイルが毎日ローテーションされ、7つまでの古いログファイルが圧縮されて保存されます。

ログローテーションの詳細については、インフラ学習サイトInfraAcademyの【Linux中級講座5システムログ】にて詳しく解説されています。

コマンドを動かして実践的に学ぶ – InfraAcademy(インフラアカデミー)

まとめ

今回の記事では、Gunicornのログの設定方法などについて詳しく解説しました。

ログファイルの出力方法や、ログレベルの設定、ログローテーションなどログ管理に必要な項目を解説しました。

ログの管理はWebアプリケーションを運用する上で大切な業務です。今回の記事が何かのお役に立てれば幸いです。

ここまでお読みいただきありがとうございました。

             

Pythonの基礎から応用まで学べる
Python WebAcademy

Python WebAcademyでは、Pythonの基礎からアーキテクチャなどの応用的な内容まで幅広く学べます。また、ブラウザ上で直接Pythonコードを試すことができ、実践的なスキルを身につけることが可能です。

             Pythonの学習を始める