【Django】Loggingでアプリケーションのログを出力する方法

Web

Djangoは強力なWebフレームワークであり、さまざまな機能を提供していますが、その中でも「Logging(ログ)」は、アプリケーションのデバッグや運用において欠かせないツールです。初心者の方でも、Loggingを適切に設定することで、問題の特定や解決がスムーズになります。

本記事では、DjangoでのLoggingの基礎から、実際の設定方法、そして運用時に役立つポイントまでを詳しく解説します。

Loggingとは?

Loggingとは、アプリケーションが実行中に発生する情報(エラー、警告、デバッグ情報など)を記録する仕組みです。Djangoには、Pythonの標準モジュールであるloggingが組み込まれており、簡単にログを出力することができます。これにより、エラー発生時の状況や、アプリケーションの動作状況を後から確認でき、迅速なトラブルシューティングが可能になります。

DjangoのLoggingの基本設定

まずは、Djangoプロジェクトにおける基本的なLoggingの設定を見ていきましょう。DjangoのLogging設定は、プロジェクトの設定ファイル(settings.py)で行います。

ログレベルについて

Loggingには「ログレベル」という概念があります。ログレベルは、記録するメッセージの重要度を示します。Djangoで利用できる主なログレベルは次の通りです。

  • DEBUG: 詳細な情報(デバッグ情報)
  • INFO: 一般的な情報
  • WARNING: 警告(重大ではないが注意が必要な情報)
  • ERROR: エラー(処理が失敗した場合の情報)
  • CRITICAL: 重大なエラー(アプリケーションのクラッシュなど)

これらのレベルに応じて、記録する内容をコントロールすることが可能です。

settings.pyでの基本設定

DjangoでのLoggingは、LOGGINGという辞書型オブジェクトで設定します。以下に基本的な設定例を示します。

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'format_name',
        },
    },
    'formatters': {
        'format_name': {
            'format': '【{levelname}】 {asctime} {module} {message}',
            'style': '{'
        },
    },       
    'loggers': {
        'django': {
            'handlers': ['console'],
            'level': 'INFO',
            'propagate': False,
        },
    },
}

version

これはLOGGING設定のバージョンを指定するためのキーです。version: 1は、Pythonのloggingモジュールの構成仕様に従っていることを示しています。現在、バージョン1しかサポートされていないため、通常はこのまま使用します。

disable_existing_loggers

既存のロガーを無効にするかどうかを指定します。Falseに設定すると、Djangoや他のサードパーティパッケージによって定義された既存のロガーが引き続き動作します。これをTrueに設定すると、既存のロガーが無効になり、LOGGINGで定義した設定だけが有効になります。通常、Falseに設定して既存のロガーも有効にしておく方が一般的です。

handlers

handlersはログをどこに出力するかを指定する部分です。この例では、consoleという名前のハンドラーが定義されています。

logging.StreamHandlerはログをコンソールに出力します。

loggers

これは特定の名前付きロガーを定義する部分です。この例では、djangoというロガーが定義されています。

ログ出力する際のソースコード

# loggingをインポート
import logging
# 取得するloggerを名前で取得
logger = logging.getLogger('django')


# トップページ
class IndexView(ListView):
    # 表示する画面
    template_name = "index.html"
    # 取得した結果を「records」と命名
    context_object_name = "records"
    model = Sample
    
    # 表示時の処理にログ取得を追加
    def get(self, request, *args, **kwargs):
        logger.info('[start]IndexView処理開始')
        return super().get(request, *args, **kwargs)
ゆーや
ゆーや

あとは好みにログをカスタマイズする方法がわかればOKだね!

ログの出力フォーマットを理解する

Loggingでは、ログメッセージの形式(フォーマット)をカスタマイズすることが可能です。これにより、ログの読みやすさを向上させたり、必要な情報を効率よく抽出できるようになります。

formattersの設定

LOGGING設定内のformattersキーは、ログの出力フォーマットを定義する部分です。以下の例を見てみましょう。formatterの部分に注目してください。

'formatters': {
        'format_name': {
            'format': '【{levelname}】 {asctime} {module} {message}',
            'style': '{'
        },
    },  

【POINT】

  • format: ログの出力形式を指定します。この例では、ログレベル({levelname})、タイムスタンプ({asctime})、モジュール名({module})、ログメッセージ({message})を順に表示します。
  • style: 文字列のフォーマットスタイルを指定します。ここでは、Pythonの新しいフォーマット方式である{}スタイルが使用されています。

よく使われるフォーマットキー

  • levelname: ログレベル(DEBUG, INFO, WARNING, ERROR, CRITICAL)
  • asctime: ログの出力時間
  • module: ログを発生させたモジュールの名前
  • message: 実際のログメッセージ
  • pathname: スクリプトのフルパス
  • lineno: ログが発生した行番号
ゆーや
ゆーや

これらを組み合わせることで、必要な情報を含んだログフォーマットを作成できます。

まとめ

DjangoのLogging機能は、アプリケーションのエラーハンドリングやデバッグにおいて非常に強力なツールです。基本的な設定からカスタムログの作成、さらにはログの出力先をカスタマイズすることで、アプリケーションの運用管理が大幅に向上します。初心者の方も、まずは基本的な設定から始め、必要に応じてカスタマイズを加えていくことで、より高度なLoggingを活用できるようになるでしょう。

コメント

タイトルとURLをコピーしました