アプリ開発ナレッジ

アプリ開発のナレッジを掲載します

Pythonお勉強Tips① - ロギング

ログレベルの出力設定が以下の記述でできる

import logging

logging.basicConfig(level=logging.INFO)

logging.info('ログ情報出力')

ログレベルは以下の順で、何も記述しないとWARNINGから出力される
CRITICAL
ERROR
WARNING
INFO
DEBUG

フォーマッタもつけることができる

formatter = '%(levelname)s:%(asctime)s:%(message)s'
logging.basicConfig(level=logging.INFO, message)

logging.info('ログ情報出力')

こうすると、「INFO:20201212123456;ログ出力情報」みたいな形でログを出力させられる
詳しくはここ参照

logging --- Python 用ロギング機能 — Python 3.10.6 ドキュメント

通常のアプリ開発のロギングはログは上記の設定を行った後、loggerを使ってログを残すようにする

題名通り
logging --- Python 用ロギング機能 — Python 3.10.6 ドキュメント

基本形

logger.getLogger(__name__)
logger.info('ログ情報出力')

ハンドラーを使ってファイル分けとかEmailイベントとかの使い分けをする

題名通り
ドキュメントはこちら
logging.handlers --- ロギングハンドラ — Python 3.10.6 ドキュメント

含めてはいけないキーワードをログに残さないようにフィルタリングする

パスワードをログに残すと大変なのでフィルタリングしたいときはこういう風に実装する

class NoPasswordFilter(logging.Filter) {
  def filter(self, record):
    log_message = record.getMessage()
    return 'password' not in log_message
}

logger.addFilter(NoPasswordFilter())

passwordという文字列が含まれていたら出力されなくなる

ログ出力はBIツール分析を見越してキーバリュー形式で書く

ログは障害時など分析するためにキーバリュー形式にするのが一般的
例えば以下のような書き方

logger.error({
  'action': 'create',
  'status': 'fail',
  'message': 'Api call is failed'
})

ログのコードを書く勘所

ログは出力させる場所の勘所が必要
例えば、処理の後の成功ログだけではなく、処理の実行前の実行開始ログを書いておくなどの工夫が地味に障害時対応に役立つ(どこでエラーが起きているかを特定しやすくなる)