DjangoでPythonのloggerを使ってログ出力

Djangoでログを出すようにしたかったので、Pythonのloggerを使えるよう設定しました。

settings.pyの設定

まず、settings.pyに以下のように設定を追加します。

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': { # ログの書式を設定
        'verbose': {
            'format': '%(asctime)s %(levelname)s %(module)s %(process)d %(thread)d %(message)s'
        },
        'simple': {
            'format': '%(asctime)s %(levelname)s %(message)s'
        },
    },
    'handlers': {
        'mail_admins': {    # メールを送信する
            'level': 'ERROR',  # ERROR以上の場合出力
            'class': 'django.utils.log.AdminEmailHandler',  # ログを出力するクラス
            'formatter': 'simple',  # どの出力フォーマットで出すかを名前で指定
        },
        'file': {  # ファイルに出力する
            'level': 'DEBUG',  # DEBUG以上の場合出力
            'class': 'logging.FileHandler',  # ログを出力するクラス
            'filename': os.path.join(BASE_DIR, 'django.log'),
            'formatter': 'simple',  # どの出力フォーマットで出すかを名前で指定
        },
    },
    'loggers': {    # ロガーを設定、ここに設定した名前を呼び出す
        'debug': {
            'handlers': ['file'],
            'level': 'DEBUG',
        },
        'error': {
            'handlers': ['file', 'mail_admins'],
            'level': 'ERROR',
        },
    }
}

loggerの呼び出し

以下でloggerを使います。

# -*- coding:utf-8 -*-

from django.core.management.base import BaseCommand

import ccxt
from .bitmex_api import bitmexApi
import logging

# BaseCommandを継承して作成
class Command(BaseCommand):

    # python manage.py help count_entryで表示されるメッセージ
    help = 'Display the number of blog articles'

    # コマンドが実行された際に呼ばれるメソッド
    def handle(self, *args, **options):
        bitmex = bitmexApi.bitmex()
        positions = bitmex.private_get_position()
        orders = bitmex.fetch_open_orders()
        if len(positions) == 0 and len(orders) == 0:
            self.logging('debug', 'no positions, no orders')

    def logging(self, level, message):
        if level == 'debug':
            logger = logging.getLogger('debug')
            logger.debug(message)
        else:
            logger = logging.getLogger('error')
            logger.error(message)

最初にimport
import logging

debugとerrorそれぞれを出力できるように
def logging(self, level, message):
を作成します。

settings.pyで設定した’debug’を使用します。

logger = logging.getLogger('debug')

メッセージをdebugとして出力します。

logger.debug(message)

エラーメッセージを吐き出す際は、以下のようにして出力レベルとメッセージを渡してやります。

self.logging('debug', 'no positions, no orders')