やる気がストロングZERO

やる気のストロングスタイル

【Django】ロギング設定について

いまいち使い方・設定の仕方がよくわからなかったので色々しらべた。
現状の知識をメモっとく。

Djangoで使われているロギング機構は、 別にDjango独自の機能ではなく、pythonの標準で用意されているloggingが使用されているという事のよう。

なので、特にDjangoでしか通用しない知識ではないが、 ここではDjangoでの設定の仕方をベースに記載する。

ロガーの設置方法

ロギングで必要なのは
(1)ログ出力したい部分にメッセージを指定
(2)指定したメッセージをどのように出力するか設定
の2つ。

(1)ログ出力したい部分にメッセージを指定

ライブラリ内やロジック内など要所要所に埋め込む。
例)

# このようにすることで、logger毎に異なるログ出力設定を指定できるようになる。
logger = logging.getLogger(__name__)

logger.debut("debugメッセージ")
logger.warning("warningメッセージ")
logger.info("infoメッセージ")
logger.error("errorメッセージ")
logger.critical("criticalメッセージ")

# ログ出力設定で指定されるログレベルによって、出力されるかどうかが変わる。
# 上記の場合、levelがERRORで指定された場合、logger.error(),logger.critical()のメッセージのみ出力される

(2)指定したメッセージをどのように出力するか設定

(1)で埋め込まれているメッセージをどのように出力するか(コンソールか、ファイルか等)の設定を行う。
Djangoでは、settings.py内でLOGGING変数に設定ディクショナリを設定する。

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
             # ↓このあたりの書式についてまだよくわかってない。
            '()': 'django.utils.log.RequireDebugFalse',
        },
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    # 出力形式を指定できる。下記のhandlersの設定に渡して使う。
    'formatters': {
        'verbose': {
            'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
            'style': '{',
        },
    },
    #  どこに出力するなどが設定できる。下記のrootやloggers設定に渡して使う。
    'handlers': {
        # ↓これは、DEBUGレベルでStreamHandler(標準出力)に、verboseフォーマッタの形式で出力するという意味
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose',
        },
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        },
        'file_images_importer': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/app/sync/logs/import_twitter_images.log',
            'formatter': 'verbose',
        },
        'file_django_log': {
            'level': 'INFO',
            'class': 'logging.FileHandler',
            'filename': '/app/sync/logs/django.log',
            'formatter': 'verbose',
        },
    },
    'root': {
        'handlers': ['console', 'file_django_log'],  # ハンドラは複数渡せる。
        'level': 'INFO',
    }
}

ライブラリ毎に設定を変えたければ、'loggers'キーに設定を追加する

    'loggers': {                                                                                                                    
        'django': {                                                                                                                 
            'handlers': ['console', 'mail_admins', 'file'],                                                                         
            'level': 'INFO',                                                                                                        
        },                                                                                                                          
        'py.warnings': {                                                                                                            
            'handlers': ['console', 'file'],                                                                                        
        },                                                                                                                          
        'django.db.backends': {                                                                                                     
            'handlers': ['console'],                                                                                                
            'level': 'DEBUG',                                                                                                       
        },