Django runserver 実行時にログを全部出しする


Django を runserver で ローカル起動している際に、ログが出ず、出すのに調べた結果を記載します。


前提

環境情報は以下の通りです。

  • OS

    sw_vers
    -----------------------
    ProductName:    Mac OS X
    ProductVersion: 10.12.5
    BuildVersion:   16F73
    -----------------------
    

  • python version

    python3 -V
    -----------------------
    Python 3.5.1
    -----------------------
    

  • Django Version

    pip3 list | grep Django
    -----------------------
    Django (1.10.7)
    -----------------------
    


コンソールにデバッグレベルでログを出力する

以下を参考に、 Python/Django: log to console under runserver, log to file under Apache - Stack Overflow

settings.py に以下の設定を追記しました。

LOGGING = {
    'version': 1,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose'
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': True,
        },
    }
}  

ロガーの handlerconsole にして出力します。


python manage.py runserver –traceback を使う

django-admin.py と manage.py — Django v1.0 documentation
にかいてありますが、
--traceback をつけて サーバー起動すると、
例外が送出された場合にスタックトレースを出力してくれます。

settings.py のロガー定義、python manage.py runserver --traceback を双方設定してサーバーを起動するようにしました。


コンソールログをファイルにも出力する

tee コマンドを使用して、ファイルとコンソール両方にログを書き出します。
以下、記事が参考になりました。
逆引きUNIXコマンド/teeコマンドでstderr(標準エラー)も対象にする - Linuxと過ごす

python manage.py runserver 2>&1 | tee django.log

標準エラーも対象にteeコマンドの入力とするのは、django のコンソールログのデフォルト出力先が、,標準エラーになっているためです。
django の ロガーの設定で標準出力に変更することもできます。
過去に変更方法を記載していますので、そちらもご確認ください。
djangoのsettings.py内で、LogHandler StreamHandlerのログ出力先を指定する | Monotalk

以上です。

コメント

カテゴリー