2018年5月27日日曜日
ウズマスター戦記
ウズマスター戦記 https://www.uzumax.org/2018/05/django_35.html

Djangoのログ出力

システムのスタートアップをどういう手順で進めていくかは人それぞれですが、私の場合は以下の順序で進行しています。

  1. とにかく起動
  2. ログ出力

今回はログ出力をやってみます。

何でも良いからさっさとログを出したい!!

細かい説明とかどうでも良いからさっさとログが出ることを確認したい人はこっちの記事のソースをコピペして下さい。

公式サイト

Django公式サイトのログの説明ページはこちら。

中途半端に日本語化されていますが、核心部分は英語です。。。
頑張って解析します。

Djangoにおけるログ出力はPython標準

私は本来はJava使いでして、Javaだったらログ出力はlog4jというログ出力ライブラリを使用するのが王道であるものの、Djangoの場合はそういった外部ライブラリの導入は必要ありません。

Python標準のライブラリ「logging」で対応可能です。

以下のような記述でログ出力が可能です。

views.pyにログ出力を記述

from django.http import HttpResponse
from logging import getLogger

logger = getLogger(__name__)


def index(request):

    logger.debug("デバッグ")
    logger.info("インフォ")
    logger.warning("ワーニング")
    logger.error("エラー")
    logger.critical("クリティカル")

    return HttpResponse("日本一平凡なDjango")

これで画面を動かして結果を確認してみましょう。

結果

ワーニング
エラー
クリティカル
[27/May/2018 17:30:12] "GET /start_samples/ HTTP/1.1" 200 24

出るには出ましたが、debugとinfoは出ないし、文字しか出て無くて時間とか出てないし、まだ設定が必要ですね。

デフォルト設定

以下のサイトを参考にさせて頂きました。


Djangoのログ設定はsetting.pyに書かれている変数「LOGGING」なのですが、初期状態ではその変数がありません。
何も無い場合、Djangoはデフォルト値として「django.utils.log.py」のDEFAULT_LOGGINGがDjangoを読み込んできます。

# Default logging for Django. This sends an email to the site admins on every
# HTTP 500 error. Depending on DEBUG, all other log records are either sent to
# the console (DEBUG=True) or discarded (DEBUG=False) by means of the
# require_debug_true filter.
DEFAULT_LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse',
        },
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'formatters': {
        'django.server': {
            '()': 'django.utils.log.ServerFormatter',
            'format': '[%(server_time)s] %(message)s',
        }
    },
    'handlers': {
        'console': {
            'level': 'INFO',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
        },
        'django.server': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'django.server',
        },
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        }
    },
    'loggers': {
        'django': {
            'handlers': ['console', 'mail_admins'],
            'level': 'INFO',
        },
        'django.server': {
            'handlers': ['django.server'],
            'level': 'INFO',
            'propagate': False,
        },
    }
}


これをコピーし、改変したものをLOGGINGとして張ります。

自分用にカスタマイズしたプロジェクトログ設定

デフォルト設定を少し改変して、自分のプロジェクトとして設定します。
コメントのある部分が改変部分です。

setting.pyのLOGGING

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse',
        },
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'formatters': {
        'django.server': {
            '()': 'django.utils.log.ServerFormatter',
            'format': '[%(server_time)s] %(message)s a',
        },
        #プロジェクト用のフォーマットを追加
        'heibon': {
            'format': '\t'.join([
                "[%(levelname)s]",
                "%(asctime)s",
                "%(name)s.%(funcName)s:%(lineno)s",
                "%(message)s",
            ])
        },
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',   #コンソールの出力水準をDEBUGに下げる
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'heibon'   #フォーマッター追加
        },
        'django.server': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'django.server',
        },
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        }
    },
    'loggers': {
        'django': {
            'handlers': ['console', 'mail_admins'],
            'level': 'INFO',
        },
        'django.server': {
            'handlers': ['django.server'],
            'level': 'INFO',
            'propagate': False,
        },
        #自身のプロジェクトの設定を追加
        'start_samples.views': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
    }
}

これで無事にデバッグまで表示されました。

結果

[DEBUG] 2018-05-27 21:03:57,262 start_samples.views.index:9     デバッグ
[INFO]  2018-05-27 21:03:57,263 start_samples.views.index:10    インフォ
[WARNING]       2018-05-27 21:03:57,263 start_samples.views.index:11    ワーニング
[ERROR] 2018-05-27 21:03:57,264 start_samples.views.index:12    エラー
[CRITICAL]      2018-05-27 21:03:57,265 start_samples.views.index:13    クリティカル
[27/May/2018 21:03:57] "GET /start_samples/ HTTP/1.1" 200 24 a

上手く出力出来ない場合

「は? コピペしてもログが出ないんだけど?」という慌てん坊さんはいませんか?
ログが出ていないとすれば、絶対ココですよ。

        #自身のプロジェクトの設定を追加
        'start_samples': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },

プロジェクト固有設定があるので、コピペでは絶対に表示出来ません。

「start_samples」の部分は、そのプロジェクト固有の機能名ですから。


heibon_django/
    heibon_django/ 
    start_samples/  ←コレ!!


ログ出力ソースの方がこうなっているでしょ?

logger = getLogger(__name__)

この「__name__」には「start_samples.views」と入って来ます。
それがLOGGINGの「'start_samples.views'」と結びつくわけです。

  • LOGGINGに「'start_samples'」と書いたら、start_samplesパッケージ配下全部のログを対象とする。
  • LOGGINGに「'start_samples.view'」と書いたら、start_samplesパッケージのview.pyをログを出力対象とする。

こういう繋がりになっていますので、各自でちゃんと設定して下さい。


0 件のコメント:

コメントを投稿

お気軽にコメント下さい。