Djangoのロギング機能について

調査
スポンサーリンク

勉強がてらDjangoのロギング機能について調べたので、それを備忘録としてまとめたいと思います。
以下について調べました。

  • 設定ファイルのフォーマット
  • ログレベルについて
  • フォーマッタについて
  • ハンドラについて
  • ロガーについて

 

目次

 


 

設定ファイルのフォーマット

Djangoのロギング機能は設定ファイル(setting.py)でログ出力のフォーマットやハンドラを設定することができます。
設定ファイルのフォーマットは以下のように記述できるようです。

# setting.py
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'format1': {
            'format': '%(asctime)s [%(levelname)s] %(process)d %(thread)d '
                      '%(pathname)s:%(lineno)d %(message)s'
        },
    },
    'handlers': {
        'file': {
            'level': 'DEBUG',
            'class': 'logging.handlers.TimedRotatingFileHandler',
            'when': 'D',
            'interval': 1,
            'backupCount': 7,
            'filename': '/var/log/app.log',
            'formatter': 'format1',
        },
        'console': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'format1',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console', 'file'],
            'level': 'INFO',
            'propagate': False,
        },
        'myapp': {
            'handlers': ['console', 'file'],
            'level': 'DEBUG',
            'propagate': False,
        },
    }
}
  • 大きく'formatters''handlers''loggers'で構成されています。
  • 'formatters'はログに出力されるときのフォーマットを設定することができます。
  • 'handlers'は「ログをファイル出力する」、「コンソールに表示する」などのロガーが実行された時の動作を設定することができます。
  • 'loggers'はアプリケーションからログ操作を行うためのロガーオブジェクトの設定をすることができます。

# Pythonのlogging機能のdictconfig()型の内容を踏襲しているみたいです。

 

ログレベルについて

レベル   数値  
CRITICAL50
ERROR40
WARNING30
INFO20
DEBUG10
NOTSET0

引用元: https://docs.python.org/ja/3/howto/logging.html#logging-levels

上に行くほどログレベルが高い。数値はユーザ側でログレベルを指定するのに使用するみたい。

 

フォーマッタについて

LOGGING = {
    # ~~~
    'formatters': {
        'format1': {
            'format': '%(asctime)s [%(levelname)s] %(process)d %(thread)d '
                      '%(pathname)s:%(lineno)d %(message)s'
        },
    },
    # ~~~
}
  • フォーマッタを任意の文字列で設定できます。上のサンプルコードでは'format1':という名称のフォーマッタを設定しています。
  • 'format':で指定できるキーは「LogRecord属性」で定義されています。

 

代表的なLogRecord属性

属性名フォーマット説明
asctime%(asctime)sログが出力されたときの時刻
デフォルトは"2003-07-08 16:49:45,896" 形式
levelname %(levelname)sロギングレベル
lineno%(lineno)dログ出力したソースの行番号
message%(message)sログメッセージ
pathname%(pathname)sログ出力したファイルの完全なパス名
process%(process)dプロセス ID
thread%(thread)dスレッド ID

引用元: https://docs.python.org/ja/3/library/logging.html#logrecord-attributes

 

ハンドラについて

LOGGING = {
    # ~~~
    'handlers': {
        'file': {
            'level': 'DEBUG',
            'class': 'logging.handlers.TimedRotatingFileHandler',
            'when': 'D',
            'interval': 1,
            'backupCount': 7,
            'filename': '/var/log/app.log',
            'formatter': 'format1',
        },
        'console': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'format1',
        },
    },
    # ~~~
}
  • ハンドラを任意の文字列で設定できます。上のサンプルコードでは'file':'console':という名称のハンドラを設定しています。
  • 'level':でこのハンドラが実行されるログレベル、'class':でロギングハンドラのクラス、'formatter':でログ出力するときに使用するフォーマッタを設定できます。
  • ロギングハンドラのクラスは「logging.handlers --- ロギングハンドラ」で定義されています。

 

代表的なロギングハンドラ

クラス名説明
logging.StreamHandlerログを標準出力に出力させる。
logging.handlers.RotatingFileHandlerログを特定のバイト数ごとにログファイルに出力させる。
'maxBytes: 'で分割させたいログファイルの最大バイト数を指定できる
'backupCount: 'で分割したログファイルをいくつ残すか決められる
'filename: 'でログファイルのパスを指定できる
logging.handlers.TimedRotatingFileHandler ログを特定の時間ごとにログファイルに出力させる。
'when: 'で分割させたい時間の単位を指定できる
'interval: 'で分割させたい時間の間隔を指定できる
'backupCount: 'で分割したログファイルをいくつ残すか決められる
'filename: 'でログファイルのパスを指定できる

引用元: https://docs.python.org/ja/3/library/logging.handlers.html

上記以外にも、Socker出力するハンドラ、Syslog出力するハンドラ、SMTP出力するハンドラなどがあるようです。

 

ロガーについて

LOGGING = {
    # ~~~
    'loggers': {
        'django': {
            'handlers': ['console', 'file'],
            'level': 'INFO',
            'propagate': False,
        },
        'myapp': {
            'handlers': ['console', 'file'],
            'level': 'DEBUG',
            'propagate': False,
        },
    }
}
  • ロガーを任意の文字列で設定できます。上のサンプルコードでは'django':'myapp':という名称のハンドラを設定しています。
  • 'django': はDjango自体が出力するログを表すので、ここは変えないほうが良いみたいです。
  • 'myapp': は自分が定義したロガーです。アプリケーションでlogging.getLogger('myapp')とすることでロガーを呼び出すことができます。
  • 'handlers':でロガーが実行されたときに呼び出されるハンドラ、'level':でロガーが実行されるログレベル、'propagate':で同じハンドラを複数回実行させない(Falseが複数回実行させない、Trueにすると複数回実行を許可する)ように設定できます。
  • 'propagate':についてはこちらを参考。

 

関連情報

ConoHa上でDockerを導入したり、DjangoでWebアプリを立ち上げたりした内容を以下の記事でまとめました。こちらもよろしければご覧になってください。

 

 

広告

 

Djangoをやるなら以下の書籍がオススメです。
DjangoでWebアプリを開発するときの要点が分かりやすくまとめられています。

 


 

ConoHa VPS は初期費用不要で月に数百円で利用できる仮想サーバのサービスです。
以下のような方には非常にオススメのサービスとなっています!

  • 勉強がてらLinuxの環境をちょっと触ってみたい
    管理者権限が実行可能なLinuxサーバ環境が構築可能です!
  • スモールスタートでサービスを提供して、うまくいったら規模をスケールアップしたい
    後からメモリサイズやCPU数などのスケールアップ/スケールダウン可能です!
  • AWSやGCPなどのクラウドサービスは高いので、もっと安くサーバ構築したい
    初期費用なし、月数百円(1時間単位も可)で利用可能です!

 

以上!

コメント

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