前回はPythonのログの基本的な考え方について解説しました。今回は課題のスクリプトでの実装例を見てみましょう。
課題のスクリプトを実行するとファイルにログ出力されるようにするため、設定ファイルのsettings.pyに以下のようにログの設定を追記します。
# settings.py import os import logging.config # 閾値 THRESHOLD = 100 # ログファイル出力先ディレクトリ LOG_DIR = "." # ログファイル LOG_FILE = os.path.join(LOG_DIR, "aggregate.log") # ログフォーマット LOG_FORMAT = '%(asctime)s %(name)s %(levelname)s %(message)s' # 出力するレベル LOG_LEVEL = logging.INFO # ファイル出力ハンドラ FILE_HANDLER = logging.FileHandler(LOG_FILE, encoding='utf-8') # ログ設定 logging.basicConfig(level=LOG_LEVEL, format=LOG_FORMAT, handlers=[FILE_HANDLER])
ログはカレントディレクトリ直下にaggregate.logという名前で出力することにします。
また、今回のスクリプトではログをコンソールに表示させると結果メッセージが埋もれてしまうため、コンソール出力ハンドラは設定していません。コンソールにも表示させる場合は以下のように記述します。
STREAM_HANDLER = logging.StreamHandler() logging.basicConfig(level=LOG_LEVEL, format=LOG_FORMAT, handlers=[FILE_HANDLER, STREAM_HANDLER])
今回は最低限、開始終了やどこの処理までおこなったのかがわかるようにmain.pyに以下の出力を実装することにします。
# main.py from settings import THRESHOLD from argparse import ArgumentParser from input_data import file2list from aggregate import aggregate from output_data import output_result from logging import getLogger # コマンドライン引数設定 parser = ArgumentParser() parser.add_argument("input_file_path", help="データファイルのパスを指定してください。") args = parser.parse_args() logger = getLogger(__name__) def main(): """ メイン処理 """ logger.info("処理開始") # 入力データ検証・取得 logger.info("入力データ取得") data_list = file2list(args.input_file_path) # 集計処理 logger.info("集計処理実行") result_count = aggregate(data_list, THRESHOLD) # 出力処理 logger.info("結果出力") output_result(result_count) logger.info("処理終了") if __name__ == '__main__': main()
こちらで実装したmain関数の処理の先頭と末尾にログ出力を追記しています。
実行すると以下のようにログが出力されることが確認できます。
2024-04-29 19:26:47,043 __main__ INFO 処理開始 2024-04-29 19:26:47,043 __main__ INFO 入力データ取得 2024-04-29 19:26:47,043 __main__ INFO 集計処理実行 2024-04-29 19:26:47,043 __main__ INFO 結果出力 2024-04-29 19:26:47,043 __main__ INFO 処理終了
各処理がどの程度かかったのか、エラーが起きた際どこまで処理が進んだのかを確認することができるようになりました。