ログには5W1Hを書く

投稿者: | 2022-11-27

目次

何を残すか

  • ログは開発時でなく、運用時に重要になる
  • 運用時のことを考えて「どんな情報が必要か」を考える
  • 5W1Hを意識して、必要なログを想定する
  • どのような問題が発生する可能性があるのかを洗い出し、可能な限り、障害解決に役立つログを出力する
  • ログに何を残すかは次のような5W1Hを意識する

5W1H

  • What
    • どの処理を、何を対象に行っているのか
    • 対象データはどれなのか
    • 何行目を処理しているのか、何行目で問題があったのか
  • Who
    • どのユーザーが対象なのか
  • When
    • いつのログなのか
    • ロガーの設定で日時を出力する
  • Where
    • どこまで処理が進んだのか、どこで発生しているログなのか、どの処理なのか
    • バッチ処理がどこまで進んだのか
    • ロガー名をPythonモジュールのパスにして、どのモジュールで発生したログかわかるようにする
    • エラーログの文字列でどの処理かをわかるようにする(ログメッセージからコードの箇所がわかる)
  • Why
    • なぜ発生したログなのか
    • エラーログを残すときに、エラーのメッセージやexec_infoを残すようにする
    • exc_info=Trueを指定するとエラー時のトレースバックがログに出力される
  • HowMuch
    • どれくらいのデータ量なのか
    • 店舗ごとの売り上げ件数が何件なのか
def main():
    try:
        logger.info('売上CSV取込み処理開始')

        sales_data = load_sales_csv()
        logger.info('売上CSV読み込み済み')

        for code, sales_rows in sales_data:
            logger.info('取込み開始 - 店舗コード: %s, データ件数: %s', code, len(sales_rows))

            try:
                for i, row in enumerate(sales_rows, start=1):
                    logger.debug('取込み処理中 - 店舗(%s): %s行目', code, i)
                    ...

            except Exception as exc:
                logger.warning('取込みエラー - 店舗(%) %s行目: エラー %s', code, i, exc, exc_info=True)
                continue
            logger.info('取込み正常終了 - 店舗コード: %s', code)

        logger.info('売上CSV取込み処理終了')
    except Exception as exc:
        logger.error('売上CSV取込み処理で予期しないエラー発生: エラー %s', exc, exc_info=True)