18
18

More than 3 years have passed since last update.

Pythonフレームワーク Flask のロギング機能 メモ

Last updated at Posted at 2021-03-18
  • Python フレームワークFlaskのロギング機能についてメモする。

標準ログ

  • Python のloggingモジュールを利用している。
  • Flask.loggerでアクセスする。

標準ログ出力

  • debugerrorのようにログレベルを指定して出力する。
from flask import Flask, request, session

app = Flask(__name__)
app.logger.debug('DEBUG')
app.logger.info('INFO')
app.logger.warning('WARNING')
app.logger.error('ERROR')
app.logger.critical('CRITICAL')

デフォルト設定

  • logger.basicConfigでロガーのデフォルト設定を行う。
  • 以下はデフォルトログ出力レベルをINFOに変更する例
import logging
from flask import Flask

app = Flask(__name__)
logging.basicConfig(level=logging.INFO)

フォーマット指定

  • アプリケーションのオブジェクトを作成する前にdictConfigを使用してプロジェクト全体のデフォルト設定として定義できる。
from logging.config import dictConfig

dictConfig({
    'version': 1,
    'formatters': {'default': {
        'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
    }},
    'handlers': {'wsgi': {
        'class': 'logging.StreamHandler',
        'stream': 'ext://flask.logging.wsgi_errors_stream',
        'formatter': 'default'
    }},
    'root': {
        'level': 'INFO',
        'handlers': ['wsgi']
    }
})

app = Flask(__name__)

ファイル出力

  • DEBUG.logというログファイルに出力する例
from flask import Flask, request, session
import logging

LOGFILE_NAME = "DEBUG.log"

app = Flask(__name__)

app.logger.setLevel(logging.DEBUG)
log_handler = logging.FileHandler(LOGFILE_NAME)
log_handler.setLevel(logging.DEBUG)
app.logger.addHandler(log_handler)

リクエスト情報出力

  • 接続元IPアドレスなどリクエスト情報を取得したい場合、logging.Formatterのサブクラスを定義し、ハンドラーに対してフォーマッターを変更する。
from flask import has_request_context, request
from flask.logging import default_handler

class RequestFormatter(logging.Formatter):
    def format(self, record):
        if has_request_context():
            record.url = request.url
            record.remote_addr = request.remote_addr
        else:
            record.url = None
            record.remote_addr = None

        return super().format(record)

formatter = RequestFormatter(
    '[%(asctime)s] %(remote_addr)s requested %(url)s '
    '%(levelname)s in %(module)s: %(message)s'
)

default_handler.setFormatter(formatter)

werkzeug Logger

  • werkzeug : Flask内部で使用されるライブラリ。

    • ルーティング定義したアプリへのリクエストを受けて以下のようなログを出力しているもの。
    127.0.0.1 - - [30/Oct/2020 10:25:37] "GET / HTTP/1.1" 200 -
    
  • フォーマッターを変更したい場合

  import logging
  from flask import has_request_context, request
  from flask.logging import default_handler

  class RequestFormatter(logging.Formatter):
      def format(self, record):
          if has_request_context():
              record.url = request.url
              record.remote_addr = request.remote_addr
          else:
              record.url = None
              record.remote_addr = None

          return super().format(record)

  formatter = RequestFormatter(
      '[%(asctime)s] %(remote_addr)s requested %(url)s '
      '%(levelname)s in %(module)s: %(message)s'
  )

  default_handler.setFormatter(formatter)
  default_handler.setLevel(logging.INFO)

  werkzeug_logger = logging.getLogger('werkzeug')
  werkzeug_logger.addHandler(default_handler)

参考情報

18
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
18