勉強がてら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()型の内容を踏襲しているみたいです。
ログレベルについて
レベル | 数値 |
---|---|
CRITICAL | 50 |
ERROR | 40 |
WARNING | 30 |
INFO | 20 |
DEBUG | 10 |
NOTSET | 0 |
引用元: 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時間単位も可)で利用可能です!
以上!
コメント