diff --git a/lambda/mbj-newdwh2021-staging-lambda-sap-fin-receive-check-daily.py b/lambda/mbj-newdwh2021-staging-lambda-sap-fin-receive-check-daily.py index de8b880c..5dcff2ae 100644 --- a/lambda/mbj-newdwh2021-staging-lambda-sap-fin-receive-check-daily.py +++ b/lambda/mbj-newdwh2021-staging-lambda-sap-fin-receive-check-daily.py @@ -3,8 +3,8 @@ import datetime import boto3 import io import re -import sys import csv +import logging # 環境変数 CHECK_BUCKET_NAME = os.environ["CHECK_BUCKET_NAME"] @@ -20,160 +20,168 @@ NDS_NOTICE_TITLE = os.environ["NDS_NOTICE_TITLE"] # 定数 ROW_COMMENT_SYMBOL = '#' -LOG_INFO = 'Info' -LOG_ERROR = 'Error' INDEX_REGEX = 0 INDEX_DATA_NAME = 1 INDEX_ROW_COMMENT_SYMBOL = 0 -INDEX_SPLIT_NUM = 0 +INDEX_SPLIT_NUM = 1 INDEX_LAST = -1 +# メール本文に出力する不足ファイル名一覧のインデント +MAIL_INDENT = '  ' # 変数 s3_client = boto3.client('s3') s3_resource = boto3.resource('s3') sns_client = boto3.client('sns') +# logger設定 +logger = logging.getLogger() +logger.setLevel(logging.INFO) +formatter = logging.Formatter( + '[%(levelname)s]\t%(asctime)s.%(msecs)dZ\t%(message)s\n', + '%Y-%m-%d %H:%M:%S' +) +for handler in logger.handlers: + handler.setFormatter(formatter) + def lambda_handler(event, context): try: # ① 処理開始ログを出力する - print_log(LOG_INFO, 'I-01-01', '処理開始 SAP_finデータ受領チェック処理(日次)') + logging.info('I-01-01 処理開始 SAP_finデータ受領チェック処理(日次)') execute_date = datetime.date.today().strftime('%Y/%m/%d') - print_log(LOG_INFO, 'I-01-02', f'処理稼働日:{execute_date}') + logging.info(f'I-01-02 処理稼働日:{execute_date}') mail_msg = '' # ② 営業日チェック処理を行う - print_log(LOG_INFO, 'I-02-01', '営業日チェック処理開始') + logging.info('I-02-01 営業日チェック処理開始') # 1.設定ファイル[メルク社非営業日設定ファイル]を読み込む try: - print_log(LOG_INFO, 'I-02-02', f'非営業日設定ファイル読込 読込元:{CONFIG_BUCKET_NAME}/{NON_BUSINESS_DAY_LIST_PATH}') + logging.info(f'I-02-02 非営業日設定ファイル読込 読込元:{CONFIG_BUCKET_NAME}/{NON_BUSINESS_DAY_LIST_PATH}') non_business_day_obj = s3_resource.Object(CONFIG_BUCKET_NAME, NON_BUSINESS_DAY_LIST_PATH) non_business_day_response = non_business_day_obj.get() - print_log(LOG_INFO, 'I-02-03', '非営業日設定ファイルを読み込みました') + logging.info('I-02-03 非営業日設定ファイルを読み込みました') except Exception as e: - print_log(LOG_ERROR, 'E-02-01', f'非営業日設定ファイルの読み込みに失敗しました エラー内容:{e}') - error_exit('E-02-01', e) + logging.error(f'E-02-01 非営業日設定ファイルの読み込みに失敗しました エラー内容:{e}') + raise FileReadException('E-02-01', e) # 2.処理稼働日が「②1.」で読み込んだ「メルク社非営業日設定ファイル」に存在するか確認する try: - print_log(LOG_INFO, 'I-02-04', f'本日が非営業日かチェックします チェック日:{execute_date}') + logging.info(f'I-02-04 本日が非営業日かチェックします チェック日:{execute_date}') none_business_day_list = [] - for i, row in enumerate(io.TextIOWrapper(io.BytesIO(non_business_day_response["Body"].read()), encoding='utf-8'), 1): + for row in io.TextIOWrapper(io.BytesIO(non_business_day_response["Body"].read()), encoding='utf-8'): if row[INDEX_ROW_COMMENT_SYMBOL] == ROW_COMMENT_SYMBOL: continue - non_date = datetime.datetime.strptime(row.rstrip('\n'), "%Y/%m/%d").strftime('%Y/%m/%d') + non_date = row.rstrip('\n') + # 日付妥当性判定 + try: + datetime.datetime.strptime(non_date, "%Y/%m/%d") + except Exception as e: + raise e none_business_day_list .append(non_date) if execute_date in none_business_day_list: - print_log(LOG_INFO, 'I-02-05', '本日は非営業日のため、チェック処理をスキップします') - sys.exit() + logging.info('I-02-05 本日は非営業日のため、チェック処理をスキップします') + return else: - print_log(LOG_INFO, 'I-02-06', '本日は営業日のため、チェック処理を実施します') + logging.info('I-02-06 本日は営業日のため、チェック処理を実施します') except Exception as e: - print_log(LOG_ERROR, 'E-02-02', f'メルク社非営業日設定ファイルに不備があります 行数:{i} エラー内容:{e}') - error_exit('E-02-02', e) + logging.error(f'E-02-02 メルク社非営業日設定ファイルに不備があります エラー内容:{e}') + raise NoneBusinessDayException('E-02-02', e) # ③ 設定ファイル[SAP_finI/Fファイルネーム設定ファイル(日次)]を読み込む try: - print_log(LOG_INFO, 'I-03-01', f'日次I/Fファイルネーム設定ファイル読込 読込元:{CONFIG_BUCKET_NAME}/{RECEIVE_DAILY_FILE_NAME_LIST_PATH}') + logging.info(f'I-03-01 日次I/Fファイルネーム設定ファイル読込 読込元:{CONFIG_BUCKET_NAME}/{RECEIVE_DAILY_FILE_NAME_LIST_PATH}') receive_daily_file_name_obj = s3_resource.Object(CONFIG_BUCKET_NAME, RECEIVE_DAILY_FILE_NAME_LIST_PATH) receive_daily_file_name_response = receive_daily_file_name_obj.get() - print_log(LOG_INFO, 'I-03-02', '日次I/Fファイルネーム設定ファイルを読み込みました') + logging.info('I-03-02 日次I/Fファイルネーム設定ファイルを読み込みました') except Exception as e: - print_log(LOG_ERROR, 'E-03-01', f'日次I/Fファイルネーム設定ファイルの読み込みに失敗しました エラー内容:{e}') - error_exit('E-03-01', e) + logging.error(f'E-03-01 日次I/Fファイルネーム設定ファイルの読み込みに失敗しました エラー内容:{e}') + raise FileReadException('E-03-01', e) # ④ 日次チェック処理を行う - print_log(LOG_INFO, 'I-04-01', '日次チェック処理開始') + logging.info('I-04-01 日次チェック処理開始') # 1.SAP保管用バケットの処理稼働日に該当するサブフォルダにあるファイル一覧を取得する - print_log(LOG_INFO, 'I-04-02', f'オブジェクトリストの取得 取得先:{CHECK_BUCKET_NAME}/{execute_date}/') + logging.info(f'I-04-02 オブジェクトリストの取得 取得先:{CHECK_BUCKET_NAME}/{execute_date}/') object_prefix = f'{execute_date}/' object_list = s3_resource.Bucket(CHECK_BUCKET_NAME).objects.filter(Prefix=object_prefix) + file_list = [] + for obj in object_list: + obj_key = obj.key.rsplit('/', INDEX_SPLIT_NUM) + file_list.append(obj_key[INDEX_LAST]) # 2.日次I/Fファイルチェック処理 - print_log(LOG_INFO, 'I-04-03', '日次I/Fファイルチェック処理開始') - print_log(LOG_INFO, 'I-04-04', '取得したオブジェクトリストと日次I/Fファイルネーム設定ファイルの突き合わせを開始します') - row_count = 0 + logging.info('I-04-03 日次I/Fファイルチェック処理開始') + logging.info('I-04-04 取得したオブジェクトリストと日次I/Fファイルネーム設定ファイルの突き合わせを開始します') + row_count = sum(1 for line in open(io.TextIOWrapper(io.BytesIO(receive_daily_file_name_response["Body"].read()), encoding='utf-8'))) match_count = 0 receive_daily_file_name_body = io.TextIOWrapper(io.BytesIO(receive_daily_file_name_response["Body"].read()), encoding='utf-8') for i, row in enumerate(csv.reader(receive_daily_file_name_body, delimiter='\t'), 1): - row_count = i file_exists = False - for object in object_list: - object_key = object.key.rsplit('/', INDEX_SPLIT_NUM) - file_name = object_key[INDEX_LAST] + for file_name in file_list: match_result = re.fullmatch(row[INDEX_REGEX], file_name) if match_result is not None: file_exists = True break if file_exists == True: match_count += 1 - print_log(LOG_INFO, 'I-04-05', f'日次I/Fファイルの受領を確認しました ファイル名:{file_name}') + logging.info(f'I-04-05 日次I/Fファイルの受領を確認しました ファイル名:{file_name}') else: - print_log(LOG_ERROR, 'E-04-01', f'日次I/Fファイルに不足があります ファイル名:{row[INDEX_DATA_NAME]}') - mail_msg = f'{mail_msg}  {row[INDEX_DATA_NAME]}\n' + logging.error(f'E-04-01 日次I/Fファイルに不足があります ファイル名:{row[INDEX_DATA_NAME]}') + mail_msg += f'{MAIL_INDENT}{row[INDEX_DATA_NAME]}\n' if row_count == match_count: - print_log(LOG_INFO, 'I-04-06', '日次I/Fファイルは全て受領していることを確認しました') + logging.info('I-04-06 日次I/Fファイルは全て受領していることを確認しました') # ⑤ 「①」でメモリ保持しているメール挿入用文言に出力内容が存在するか確認する - print_log(LOG_INFO, 'I-05-01', 'メール送信処理開始') + logging.info('I-05-01 メール送信処理開始') if len(mail_msg) > 0: # 1.存在した場合 - print_log(LOG_INFO, 'I-05-02', f'{execute_date} 日次I/Fファイルに不足があるため、メール送信処理を開始します') + logging.info(f'I-05-02 {execute_date} 日次I/Fファイルに不足があるため、メール送信処理を開始します') try: - print_log(LOG_INFO, 'I-05-03', f'通知メール(タイトル)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{NOTICE_MAIL_TITLE_TEMPLATE_PATH}') + logging.info(f'I-05-03 通知メール(タイトル)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{NOTICE_MAIL_TITLE_TEMPLATE_PATH}') mail_title_obj = s3_client.get_object(Bucket=CONFIG_BUCKET_NAME, Key=NOTICE_MAIL_TITLE_TEMPLATE_PATH) mail_title = mail_title_obj['Body'].read().decode('utf-8') - print_log(LOG_INFO, 'I-05-04', '通知メール(タイトル)テンプレートファイルを読み込みました') + logging.info('I-05-04 通知メール(タイトル)テンプレートファイルを読み込みました') except Exception as e: - print_log(LOG_ERROR, 'E-05-01', f'通知メール(タイトル)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') - error_exit('E-05-01', e) + logging.error(f'E-05-01 通知メール(タイトル)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') + raise FileReadException('E-05-01', e) try: - print_log(LOG_INFO, 'I-05-05', f'通知メール(本文)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{NOTICE_MAIL_BODY_TEMPLATE_PATH}') + logging.info(f'I-05-05 通知メール(本文)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{NOTICE_MAIL_BODY_TEMPLATE_PATH}') mail_body_obj = s3_client.get_object(Bucket=CONFIG_BUCKET_NAME, Key=NOTICE_MAIL_BODY_TEMPLATE_PATH) mail_body_response = mail_body_obj['Body'].read().decode('utf-8') mail_body = mail_body_response.replace(MAIL_BODY_REPLACE_SYMBOL, mail_msg) - print_log(LOG_INFO, 'I-05-06', '通知メール(本文)テンプレートファイルを読み込みました') + logging.info('I-05-06 通知メール(本文)テンプレートファイルを読み込みました') except Exception as e: - print_log(LOG_ERROR, 'E-05-02', f'通知メール(本文)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') - error_exit('E-05-02', e) + logging.error(f'E-05-02 通知メール(本文)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') + raise FileReadException('E-05-02', e) - print_log(LOG_INFO, 'I-05-07', f'メール送信指示をします 送信先トピック:{MBJ_SAP_NOTICE_TOPIC}') + logging.info(f'I-05-07 メール送信指示をします 送信先トピック:{MBJ_SAP_NOTICE_TOPIC}') params = { 'TopicArn': MBJ_SAP_NOTICE_TOPIC, 'Subject': mail_title, 'Message': mail_body } sns_client.publish(**params) - print_log(LOG_INFO, 'I-05-08', 'メール送信指示をしました') + logging.info('I-05-08 メール送信指示をしました') else: # 2.存在しない場合 - print_log(LOG_INFO, 'I-05-09', f'{execute_date} 日次I/Fファイルに不足がなかったため、メール送信処理をスキップします') + logging.info(f'I-05-09 {execute_date} 日次I/Fファイルに不足がなかったため、メール送信処理をスキップします') # ⑥ 処理終了ログを出力する - print_log(LOG_INFO, 'I-06-01', '処理終了 SAP_finデータ受領チェック処理(日次)') + logging.info('I-06-01 処理終了 SAP_finデータ受領チェック処理(日次)') + except CustomException as e: + error_notice(e.id, e.arg) except Exception as e: - print_log(LOG_ERROR, 'E-99', f'想定外のエラーが発生しました エラー内容:{e}') - error_exit('E-99', e) + logging.error(f'E-99 想定外のエラーが発生しました エラー内容:{e}') + error_notice('E-99', e) + return -def print_log(log_level, log_id, msg): +def error_notice(error_log_id, exception) -> None: try: - print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} {log_level} {log_id} {msg}') - except Exception as e: - print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-99 想定外のエラーが発生しました エラー内容:{e}') - error_exit('E-99', e) - - -def error_exit(error_log_id, exception): - try: - print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-ERR-01 エラー処理開始') - - print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-ERR-02 処理異常通知の送信指示をしました 通知先トピック:{NDS_NOTICE_TOPIC}') error_msg = f'{error_log_id} のエラーが発生しました。ご確認ください\n詳細:{exception}' params = { 'TopicArn': NDS_NOTICE_TOPIC, @@ -181,9 +189,21 @@ def error_exit(error_log_id, exception): 'Message': error_msg } sns_client.publish(**params) - - print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-ERR-03 エラー終了 処理を中断します') - sys.exit() + logging.error(f'E-ERR-01 処理異常通知の送信指示をしました 通知先トピック:{NDS_NOTICE_TOPIC}') except Exception as e: - print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-99 想定外のエラーが発生しました エラー内容:{e}') - sys.exit() + logging.error(f'E-98 処理異常通知の送信指示に失敗しました エラー内容:{e}') + return + + +class CustomException(Exception): + def __init__(self, id, arg): + self.arg = arg + self.id = id + + +class FileReadException(CustomException): + pass + + +class NoneBusinessDayException(CustomException): + pass diff --git a/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-daily.py b/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-daily.py index 79bc4ac9..5c87970a 100644 --- a/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-daily.py +++ b/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-daily.py @@ -3,8 +3,8 @@ import datetime import boto3 import io import re -import sys import csv +import logging # 環境変数 CHECK_BUCKET_NAME = os.environ["CHECK_BUCKET_NAME"] @@ -20,160 +20,168 @@ NDS_NOTICE_TITLE = os.environ["NDS_NOTICE_TITLE"] # 定数 ROW_COMMENT_SYMBOL = '#' -LOG_INFO = 'Info' -LOG_ERROR = 'Error' INDEX_REGEX = 0 INDEX_DATA_NAME = 1 INDEX_ROW_COMMENT_SYMBOL = 0 INDEX_SPLIT_NUM = 1 INDEX_LAST = -1 +# メール本文に出力する不足ファイル名一覧のインデント +MAIL_INDENT = '  ' # 変数 s3_client = boto3.client('s3') s3_resource = boto3.resource('s3') sns_client = boto3.client('sns') +# logger設定 +logger = logging.getLogger() +logger.setLevel(logging.INFO) +formatter = logging.Formatter( + '[%(levelname)s]\t%(asctime)s.%(msecs)dZ\t%(message)s\n', + '%Y-%m-%d %H:%M:%S' +) +for handler in logger.handlers: + handler.setFormatter(formatter) + def lambda_handler(event, context): try: # ① 処理開始ログを出力する - print_log(LOG_INFO, 'I-01-01', '処理開始 SAP_supデータ受領チェック処理(日次)') + logging.info('I-01-01 処理開始 SAP_supデータ受領チェック処理(日次)') execute_date = datetime.date.today().strftime('%Y/%m/%d') - print_log(LOG_INFO, 'I-01-02', f'処理稼働日:{execute_date}') + logging.info(f'I-01-02 処理稼働日:{execute_date}') mail_msg = '' # ② 営業日チェック処理を行う - print_log(LOG_INFO, 'I-02-01', '営業日チェック処理開始') + logging.info('I-02-01 営業日チェック処理開始') # 1.設定ファイル[メルク社非営業日設定ファイル]を読み込む try: - print_log(LOG_INFO, 'I-02-02', f'非営業日設定ファイル読込 読込元:{CONFIG_BUCKET_NAME}/{NON_BUSINESS_DAY_LIST_PATH}') + logging.info(f'I-02-02 非営業日設定ファイル読込 読込元:{CONFIG_BUCKET_NAME}/{NON_BUSINESS_DAY_LIST_PATH}') non_business_day_obj = s3_resource.Object(CONFIG_BUCKET_NAME, NON_BUSINESS_DAY_LIST_PATH) non_business_day_response = non_business_day_obj.get() - print_log(LOG_INFO, 'I-02-03', '非営業日設定ファイルを読み込みました') + logging.info('I-02-03 非営業日設定ファイルを読み込みました') except Exception as e: - print_log(LOG_ERROR, 'E-02-01', f'非営業日設定ファイルの読み込みに失敗しました エラー内容:{e}') - error_exit('E-02-01', e) + logging.error(f'E-02-01 非営業日設定ファイルの読み込みに失敗しました エラー内容:{e}') + raise FileReadException('E-02-01', e) # 2.処理稼働日が「②1.」で読み込んだ「メルク社非営業日設定ファイル」に存在するか確認する try: - print_log(LOG_INFO, 'I-02-04', f'本日が非営業日かチェックします チェック日:{execute_date}') + logging.info(f'I-02-04 本日が非営業日かチェックします チェック日:{execute_date}') none_business_day_list = [] - for i, row in enumerate(io.TextIOWrapper(io.BytesIO(non_business_day_response["Body"].read()), encoding='utf-8'), 1): + for row in io.TextIOWrapper(io.BytesIO(non_business_day_response["Body"].read()), encoding='utf-8'): if row[INDEX_ROW_COMMENT_SYMBOL] == ROW_COMMENT_SYMBOL: continue - non_date = datetime.datetime.strptime(row.rstrip('\n'), "%Y/%m/%d").strftime('%Y/%m/%d') + non_date = row.rstrip('\n') + # 日付妥当性判定 + try: + datetime.datetime.strptime(non_date, "%Y/%m/%d") + except Exception as e: + raise e none_business_day_list .append(non_date) if execute_date in none_business_day_list: - print_log(LOG_INFO, 'I-02-05', '本日は非営業日のため、チェック処理をスキップします') - sys.exit() + logging.info('I-02-05 本日は非営業日のため、チェック処理をスキップします') + return else: - print_log(LOG_INFO, 'I-02-06', '本日は営業日のため、チェック処理を実施します') + logging.info('I-02-06 本日は営業日のため、チェック処理を実施します') except Exception as e: - print_log(LOG_ERROR, 'E-02-02', f'メルク社非営業日設定ファイルに不備があります 行数:{i} エラー内容:{e}') - error_exit('E-02-02', e) + logging.error(f'E-02-02 メルク社非営業日設定ファイルに不備があります エラー内容:{e}') + raise NoneBusinessDayException('E-02-02', e) # ③ 設定ファイル[SAP_supI/Fファイルネーム設定ファイル(日次)]を読み込む try: - print_log(LOG_INFO, 'I-03-01', f'日次I/Fファイルネーム設定ファイル読込 読込元:{CONFIG_BUCKET_NAME}/{RECEIVE_DAILY_FILE_NAME_LIST_PATH}') + logging.info(f'I-03-01 日次I/Fファイルネーム設定ファイル読込 読込元:{CONFIG_BUCKET_NAME}/{RECEIVE_DAILY_FILE_NAME_LIST_PATH}') receive_daily_file_name_obj = s3_resource.Object(CONFIG_BUCKET_NAME, RECEIVE_DAILY_FILE_NAME_LIST_PATH) receive_daily_file_name_response = receive_daily_file_name_obj.get() - print_log(LOG_INFO, 'I-03-02', '日次I/Fファイルネーム設定ファイルを読み込みました') + logging.info('I-03-02 日次I/Fファイルネーム設定ファイルを読み込みました') except Exception as e: - print_log(LOG_ERROR, 'E-03-01', f'日次I/Fファイルネーム設定ファイルの読み込みに失敗しました エラー内容:{e}') - error_exit('E-03-01', e) + logging.error(f'E-03-01 日次I/Fファイルネーム設定ファイルの読み込みに失敗しました エラー内容:{e}') + raise FileReadException('E-03-01', e) # ④ 日次チェック処理を行う - print_log(LOG_INFO, 'I-04-01', '日次チェック処理開始') + logging.info('I-04-01 日次チェック処理開始') # 1.SAP保管用バケットの処理稼働日に該当するサブフォルダにあるファイル一覧を取得する - print_log(LOG_INFO, 'I-04-02', f'オブジェクトリストの取得 取得先:{CHECK_BUCKET_NAME}/{execute_date}/') + logging.info(f'I-04-02 オブジェクトリストの取得 取得先:{CHECK_BUCKET_NAME}/{execute_date}/') object_prefix = f'{execute_date}/' object_list = s3_resource.Bucket(CHECK_BUCKET_NAME).objects.filter(Prefix=object_prefix) + file_list = [] + for obj in object_list: + obj_key = obj.key.rsplit('/', INDEX_SPLIT_NUM) + file_list.append(obj_key[INDEX_LAST]) # 2.日次I/Fファイルチェック処理 - print_log(LOG_INFO, 'I-04-03', '日次I/Fファイルチェック処理開始') - print_log(LOG_INFO, 'I-04-04', '取得したオブジェクトリストと日次I/Fファイルネーム設定ファイルの突き合わせを開始します') - row_count = 0 + logging.info('I-04-03 日次I/Fファイルチェック処理開始') + logging.info('I-04-04 取得したオブジェクトリストと日次I/Fファイルネーム設定ファイルの突き合わせを開始します') + row_count = sum(1 for line in open(io.TextIOWrapper(io.BytesIO(receive_daily_file_name_response["Body"].read()), encoding='utf-8'))) match_count = 0 receive_daily_file_name_body = io.TextIOWrapper(io.BytesIO(receive_daily_file_name_response["Body"].read()), encoding='utf-8') for i, row in enumerate(csv.reader(receive_daily_file_name_body, delimiter='\t'), 1): - row_count = i file_exists = False - for object in object_list: - object_key = object.key.rsplit('/', INDEX_SPLIT_NUM) - file_name = object_key[INDEX_LAST] + for file_name in file_list: match_result = re.fullmatch(row[INDEX_REGEX], file_name) if match_result is not None: file_exists = True break if file_exists == True: match_count += 1 - print_log(LOG_INFO, 'I-04-05', f'日次I/Fファイルの受領を確認しました ファイル名:{file_name}') + logging.info(f'I-04-05 日次I/Fファイルの受領を確認しました ファイル名:{file_name}') else: - print_log(LOG_ERROR, 'E-04-01', f'日次I/Fファイルに不足があります ファイル名:{row[INDEX_DATA_NAME]}') - mail_msg = f'{mail_msg}  {row[INDEX_DATA_NAME]}\n' + logging.error(f'E-04-01 日次I/Fファイルに不足があります ファイル名:{row[INDEX_DATA_NAME]}') + mail_msg += f'{MAIL_INDENT}{row[INDEX_DATA_NAME]}\n' if row_count == match_count: - print_log(LOG_INFO, 'I-04-06', '日次I/Fファイルは全て受領していることを確認しました') + logging.info('I-04-06 日次I/Fファイルは全て受領していることを確認しました') # ⑤ 「①」でメモリ保持しているメール挿入用文言に出力内容が存在するか確認する - print_log(LOG_INFO, 'I-05-01', 'メール送信処理開始') + logging.info('I-05-01 メール送信処理開始') if len(mail_msg) > 0: # 1.存在した場合 - print_log(LOG_INFO, 'I-05-02', f'{execute_date} 日次I/Fファイルに不足があるため、メール送信処理を開始します') + logging.info(f'I-05-02 {execute_date} 日次I/Fファイルに不足があるため、メール送信処理を開始します') try: - print_log(LOG_INFO, 'I-05-03', f'通知メール(タイトル)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{NOTICE_MAIL_TITLE_TEMPLATE_PATH}') + logging.info(f'I-05-03 通知メール(タイトル)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{NOTICE_MAIL_TITLE_TEMPLATE_PATH}') mail_title_obj = s3_client.get_object(Bucket=CONFIG_BUCKET_NAME, Key=NOTICE_MAIL_TITLE_TEMPLATE_PATH) mail_title = mail_title_obj['Body'].read().decode('utf-8') - print_log(LOG_INFO, 'I-05-04', '通知メール(タイトル)テンプレートファイルを読み込みました') + logging.info('I-05-04 通知メール(タイトル)テンプレートファイルを読み込みました') except Exception as e: - print_log(LOG_ERROR, 'E-05-01', f'通知メール(タイトル)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') - error_exit('E-05-01', e) + logging.error(f'E-05-01 通知メール(タイトル)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') + raise FileReadException('E-05-01', e) try: - print_log(LOG_INFO, 'I-05-05', f'通知メール(本文)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{NOTICE_MAIL_BODY_TEMPLATE_PATH}') + logging.info(f'I-05-05 通知メール(本文)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{NOTICE_MAIL_BODY_TEMPLATE_PATH}') mail_body_obj = s3_client.get_object(Bucket=CONFIG_BUCKET_NAME, Key=NOTICE_MAIL_BODY_TEMPLATE_PATH) mail_body_response = mail_body_obj['Body'].read().decode('utf-8') mail_body = mail_body_response.replace(MAIL_BODY_REPLACE_SYMBOL, mail_msg) - print_log(LOG_INFO, 'I-05-06', '通知メール(本文)テンプレートファイルを読み込みました') + logging.info('I-05-06 通知メール(本文)テンプレートファイルを読み込みました') except Exception as e: - print_log(LOG_ERROR, 'E-05-02', f'通知メール(本文)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') - error_exit('E-05-02', e) + logging.error(f'E-05-02 通知メール(本文)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') + raise FileReadException('E-05-02', e) - print_log(LOG_INFO, 'I-05-07', f'メール送信指示をします 送信先トピック:{MBJ_SAP_NOTICE_TOPIC}') + logging.info(f'I-05-07 メール送信指示をします 送信先トピック:{MBJ_SAP_NOTICE_TOPIC}') params = { 'TopicArn': MBJ_SAP_NOTICE_TOPIC, 'Subject': mail_title, 'Message': mail_body } sns_client.publish(**params) - print_log(LOG_INFO, 'I-05-08', 'メール送信指示をしました') + logging.info('I-05-08 メール送信指示をしました') else: # 2.存在しない場合 - print_log(LOG_INFO, 'I-05-09', f'{execute_date} 日次I/Fファイルに不足がなかったため、メール送信処理をスキップします') + logging.info(f'I-05-09 {execute_date} 日次I/Fファイルに不足がなかったため、メール送信処理をスキップします') # ⑥ 処理終了ログを出力する - print_log(LOG_INFO, 'I-06-01', '処理終了 SAP_supデータ受領チェック処理(日次)') + logging.info('I-06-01 処理終了 SAP_supデータ受領チェック処理(日次)') + except CustomException as e: + error_notice(e.id, e.arg) except Exception as e: - print_log(LOG_ERROR, 'E-99', f'想定外のエラーが発生しました エラー内容:{e}') - error_exit('E-99', e) + logging.error(f'E-99 想定外のエラーが発生しました エラー内容:{e}') + error_notice('E-99', e) + return -def print_log(log_level, log_id, msg): +def error_notice(error_log_id, exception) -> None: try: - print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} {log_level} {log_id} {msg}') - except Exception as e: - print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-99 想定外のエラーが発生しました エラー内容:{e}') - error_exit('E-99', e) - - -def error_exit(error_log_id, exception): - try: - print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-ERR-01 エラー処理開始') - - print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-ERR-02 処理異常通知の送信指示をしました 通知先トピック:{NDS_NOTICE_TOPIC}') error_msg = f'{error_log_id} のエラーが発生しました。ご確認ください\n詳細:{exception}' params = { 'TopicArn': NDS_NOTICE_TOPIC, @@ -181,9 +189,21 @@ def error_exit(error_log_id, exception): 'Message': error_msg } sns_client.publish(**params) - - print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-ERR-03 エラー終了 処理を中断します') - sys.exit() + logging.error(f'E-ERR-01 処理異常通知の送信指示をしました 通知先トピック:{NDS_NOTICE_TOPIC}') except Exception as e: - print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-99 想定外のエラーが発生しました エラー内容:{e}') - sys.exit() + logging.error(f'E-98 処理異常通知の送信指示に失敗しました エラー内容:{e}') + return + + +class CustomException(Exception): + def __init__(self, id, arg): + self.arg = arg + self.id = id + + +class FileReadException(CustomException): + pass + + +class NoneBusinessDayException(CustomException): + pass