diff --git a/lambda/mbj-newdwh2021-staging-lambda-sap-fin-monthly-data-notice-daily.py b/lambda/mbj-newdwh2021-staging-lambda-sap-fin-monthly-data-notice-daily.py index 64949289..13453ae1 100644 --- a/lambda/mbj-newdwh2021-staging-lambda-sap-fin-monthly-data-notice-daily.py +++ b/lambda/mbj-newdwh2021-staging-lambda-sap-fin-monthly-data-notice-daily.py @@ -4,6 +4,7 @@ import boto3 import io import re import sys +import csv # 環境変数 CONFIG_BUCKET_NAME = os.environ["CONFIG_BUCKET_NAME"] @@ -16,127 +17,121 @@ NDS_NOTICE_TOPIC = os.environ["NDS_NOTICE_TOPIC"] NDS_NOTICE_TITLE = os.environ["NDS_NOTICE_TITLE"] # 定数 -ROW_COMMENT_SYMBOL = '#' +LOG_INFO = 'Info' +LOG_ERROR = 'Error' +INDEX_REGEX = 0 +INDEX_DATA_NAME = 1 # 変数 s3_client = boto3.client('s3') s3_resource = boto3.resource('s3') sns_client = boto3.client('sns') -mail_msg = '' def lambda_handler(event, context): try: # ① 処理開始ログを出力する - info_log('I-01-01', '処理開始 SAP_finデータ月次I/F受領通知処理') + print_log(LOG_INFO, 'I-01-01', '処理開始 SAP_finデータ月次I/F受領通知処理') today = datetime.date.today().strftime('%Y/%m/%d') - info_log('I-01-02', f'処理稼働日:{today}') + print_log(LOG_INFO, 'I-01-02', f'処理稼働日:{today}') + mail_msg = '' # ② 処理開始時に受け取ったイベント情報の以下内容をログに出力しメモリに保持する - info_log('I-02-01', 'SAPデータ復号処理開始') - + print_log(LOG_INFO, 'I-02-01', 'イベント情報出力処理') s3_event = event["Records"][0]["s3"] event_bucket_name = s3_event["bucket"]["name"] event_file_path = s3_event["object"]["key"] event_file_name = os.path.basename(event_file_path) event_data_source_name = os.path.dirname(event_file_path).split('/')[0] - info_log('I-02-02', f'バケット名:{event_bucket_name}') - info_log('I-02-03', f'ファイルパス:{event_file_path}') - info_log('I-02-04', f'データソース名:{event_data_source_name}') + print_log(LOG_INFO, 'I-02-02', f'バケット名:{event_bucket_name}') + print_log(LOG_INFO, 'I-02-03', f'ファイルパス:{event_file_path}') + print_log(LOG_INFO, 'I-02-04', f'データソース名:{event_data_source_name}') # ③ 設定ファイル[SAP_finI/Fファイルネーム設定ファイル(月次)]を読み込む try: - info_log('I-03-01', f'日次I/Fファイルネーム設定ファイル読込 読込元:{CONFIG_BUCKET_NAME}/{RECEIVE_MONTHLY_FILE_NAME_LIST_PATH}') + print_log(LOG_INFO, 'I-03-01', f'月次I/Fファイルネーム設定ファイル読込 読込元:{CONFIG_BUCKET_NAME}/{RECEIVE_MONTHLY_FILE_NAME_LIST_PATH}') receive_monthly_file_name_obj = s3_resource.Object(CONFIG_BUCKET_NAME, RECEIVE_MONTHLY_FILE_NAME_LIST_PATH) receive_monthly_file_name_response = receive_monthly_file_name_obj.get() - info_log('I-03-02', '日次I/Fファイルネーム設定ファイルを読み込みました') + print_log(LOG_INFO, 'I-03-02', '月次I/Fファイルネーム設定ファイルを読み込みました') except Exception as e: - error_log('E-03-01', '日次I/Fファイルネーム設定ファイルの読み込みに失敗しました') + print_log(LOG_ERROR, 'E-03-01', '月次I/Fファイルネーム設定ファイルの読み込みに失敗しました') error_process('E-03-01', e) # ④ 月次I/Fファイル受領通知処理を行う - info_log('I-04-01', '月次I/Fファイル受領通知処理開始') - - info_log('I-04-02', f'受領したファイル名:{event_file_name}') - info_log('I-04-03', '受領したファイル名と月次I/Fファイルネーム設定ファイルの突き合わせを開始します') - file_exsit = False - for row in io.TextIOWrapper(io.BytesIO(receive_monthly_file_name_response["Body"].read()), encoding='utf-8'): - match_result = re.fullmatch(row[0], event_file_name) + print_log(LOG_INFO, 'I-04-01', '月次I/Fファイル受領通知処理開始') + print_log(LOG_INFO, 'I-04-02', f'受領したファイル名:{event_file_name}') + print_log(LOG_INFO, 'I-04-03', '受領したファイル名と月次I/Fファイルネーム設定ファイルの突き合わせを開始します') + file_exists = False + receive_monthly_file_name_body = io.TextIOWrapper(io.BytesIO(receive_monthly_file_name_response["Body"].read()), encoding='utf-8') + for row in csv.reader(receive_monthly_file_name_body, delimiter='\t'): + match_result = re.fullmatch(row[INDEX_REGEX], event_file_name) if match_result is not None: - file_exsit = True + file_exists = True break - if file_exsit == True: - info_log('I-04-04', '月次I/Fを受領しました') - mail_msg = f'  {row[1]} {event_file_name}\n' + if file_exists == True: + print_log(LOG_INFO, 'I-04-04', f'月次I/Fを受領しました ファイル名:{row[INDEX_DATA_NAME]} {event_file_name}') + mail_msg = f'{mail_msg}  {row[INDEX_DATA_NAME]} {event_file_name}\n' else: - info_log('I-04-05', '受領したファイルは月次I/Fではありませんでした') + print_log(LOG_INFO, 'I-04-05', '受領したファイルは月次I/Fではありませんでした') - # ⑤ メール通知本文に出力内容が存在するか確認する - info_log('I-05-01', 'メール送信処理開始') + # ⑤ 「①」でメモリ保持しているメール挿入用文言に出力内容が存在するか確認する + print_log(LOG_INFO, 'I-05-01', 'メール送信処理開始') if len(mail_msg) > 0: # 1.存在した場合 - info_log('I-05-02', '月次I/Fファイルを受領したため、メール送信処理を開始します') + print_log(LOG_INFO, 'I-05-02', '月次I/Fファイルを受領したため、メール送信処理を開始します') try: - info_log('I-05-03', f'通知メール(タイトル)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{NOTICE_MAIL_TITLE_TEMPLATE_PATH}') + print_log(LOG_INFO, 'I-05-03', f'通知メール(タイトル)テンプレートファイル読込 読込元:{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') - info_log('I-05-04', '通知メール(タイトル)テンプレートファイルを読み込みました') + print_log(LOG_INFO, 'I-05-04', '通知メール(タイトル)テンプレートファイルを読み込みました') except Exception as e: - error_log('E-05-01', '通知メール(タイトル)テンプレートファイルの読み込みに失敗しました') + print_log(LOG_ERROR, 'E-05-01', '通知メール(タイトル)テンプレートファイルの読み込みに失敗しました') error_process('E-05-01', e) try: - info_log('I-05-05', f'通知メール(本文)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{NOTICE_MAIL_BODY_TEMPLATE_PATH}') + print_log(LOG_INFO, 'I-05-05', f'通知メール(本文)テンプレートファイル読込 読込元:{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) - info_log('I-05-06', '通知メール(本文)テンプレートファイルを読み込みました') + print_log(LOG_INFO, 'I-05-06', '通知メール(本文)テンプレートファイルを読み込みました') except Exception as e: - error_log('E-05-02', '通知メール(本文)テンプレートファイルの読み込みに失敗しました') + print_log(LOG_ERROR, 'E-05-02', '通知メール(本文)テンプレートファイルの読み込みに失敗しました') error_process('E-05-02', e) - info_log('I-05-07', f'メール送信指示をします 送信先トピック:{MBJ_SAP_NOTICE_TOPIC}') + print_log(LOG_INFO, 'I-05-07', f'メール送信指示をします 送信先トピック:{MBJ_SAP_NOTICE_TOPIC}') params = { 'TopicArn': MBJ_SAP_NOTICE_TOPIC, 'Subject': mail_title, 'Message': mail_body } sns_client.publish(**params) - info_log('I-05-08', 'メール送信指示をしました') + print_log(LOG_INFO, 'I-05-08', 'メール送信指示をしました') else: # 2.存在しない場合 - info_log('I-05-09', '受領したファイルは月次I/Fファイルではないため、メール送信処理をスキップします') + print_log(LOG_INFO, 'I-05-09', '受領したファイルは月次I/Fファイルではないため、メール送信処理をスキップします') # ⑥ 処理終了ログを出力する - info_log('I-06-01', '処理終了 SAP_finデータ月次I/F受領通知処理') + print_log(LOG_INFO, 'I-06-01', '処理終了 SAP_finデータ月次I/F受領通知処理') except Exception as e: - error_log('E-99', f'想定外のエラーが発生しました エラー内容:{e}') + print_log(LOG_ERROR, 'E-99', f'想定外のエラーが発生しました エラー内容:{e}') error_process('E-99', e) -def info_log(log_id, msg): +def print_log(log_level, log_id, msg): try: - print(f'{datetime.now():%Y-%m-%d %H:%M:%S} Info {log_id} {msg}') + print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} {log_level} {log_id} {msg}') except Exception as e: - error_log('E-99', f'想定外のエラーが発生しました エラー内容:{e}') - error_process('E-99', e) - - -def error_log(log_id, msg): - try: - print(f'{datetime.now():%Y-%m-%d %H:%M:%S} Error {log_id} {msg}') - except Exception as e: - print(f'{datetime.now():%Y-%m-%d %H:%M:%S} Error E-99 想定外のエラーが発生しました エラー内容:{e}') + print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-99 想定外のエラーが発生しました エラー内容:{e}') error_process('E-99', e) def error_process(error_log_id, exception): try: - print(f'{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-01 エラー処理開始') - print(f'{datetime.now():%Y-%m-%d %H:%M:%S} Error E-ERR-02 処理異常通知の送信指示をしました 通知先トピック:{NDS_NOTICE_TOPIC}') + 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, @@ -145,8 +140,8 @@ def error_process(error_log_id, exception): } sns_client.publish(**params) - print(f'{datetime.now():%Y-%m-%d %H:%M:%S} Error E-ERR-03 エラー終了 処理を中断します') + print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-ERR-03 エラー終了 処理を中断します') sys.exit() except Exception as e: - print(f'{datetime.now():%Y-%m-%d %H:%M:%S} Error E-99 想定外のエラーが発生しました エラー内容:{e}') + print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-99 想定外のエラーが発生しました エラー内容:{e}') sys.exit() diff --git a/lambda/mbj-newdwh2021-staging-lambda-sap-sup-monthly-data-notice-daily.py b/lambda/mbj-newdwh2021-staging-lambda-sap-sup-monthly-data-notice-daily.py index 0f1612bc..b64d2039 100644 --- a/lambda/mbj-newdwh2021-staging-lambda-sap-sup-monthly-data-notice-daily.py +++ b/lambda/mbj-newdwh2021-staging-lambda-sap-sup-monthly-data-notice-daily.py @@ -4,6 +4,7 @@ import boto3 import io import re import sys +import csv # 環境変数 CONFIG_BUCKET_NAME = os.environ["CONFIG_BUCKET_NAME"] @@ -16,127 +17,121 @@ NDS_NOTICE_TOPIC = os.environ["NDS_NOTICE_TOPIC"] NDS_NOTICE_TITLE = os.environ["NDS_NOTICE_TITLE"] # 定数 -ROW_COMMENT_SYMBOL = '#' +LOG_INFO = 'Info' +LOG_ERROR = 'Error' +INDEX_REGEX = 0 +INDEX_DATA_NAME = 1 # 変数 s3_client = boto3.client('s3') s3_resource = boto3.resource('s3') sns_client = boto3.client('sns') -mail_msg = '' def lambda_handler(event, context): try: # ① 処理開始ログを出力する - info_log('I-01-01', '処理開始 SAP_supデータ月次I/F受領通知処理') + print_log(LOG_INFO, 'I-01-01', '処理開始 SAP_supデータ月次I/F受領通知処理') today = datetime.date.today().strftime('%Y/%m/%d') - info_log('I-01-02', f'処理稼働日:{today}') + print_log(LOG_INFO, 'I-01-02', f'処理稼働日:{today}') + mail_msg = '' # ② 処理開始時に受け取ったイベント情報の以下内容をログに出力しメモリに保持する - info_log('I-02-01', 'SAPデータ復号処理開始') - + print_log(LOG_INFO, 'I-02-01', 'イベント情報出力処理') s3_event = event["Records"][0]["s3"] event_bucket_name = s3_event["bucket"]["name"] event_file_path = s3_event["object"]["key"] event_file_name = os.path.basename(event_file_path) event_data_source_name = os.path.dirname(event_file_path).split('/')[0] - info_log('I-02-02', f'バケット名:{event_bucket_name}') - info_log('I-02-03', f'ファイルパス:{event_file_path}') - info_log('I-02-04', f'データソース名:{event_data_source_name}') + print_log(LOG_INFO, 'I-02-02', f'バケット名:{event_bucket_name}') + print_log(LOG_INFO, 'I-02-03', f'ファイルパス:{event_file_path}') + print_log(LOG_INFO, 'I-02-04', f'データソース名:{event_data_source_name}') # ③ 設定ファイル[SAP_supI/Fファイルネーム設定ファイル(月次)]を読み込む try: - info_log('I-03-01', f'日次I/Fファイルネーム設定ファイル読込 読込元:{CONFIG_BUCKET_NAME}/{RECEIVE_MONTHLY_FILE_NAME_LIST_PATH}') + print_log(LOG_INFO, 'I-03-01', f'月次I/Fファイルネーム設定ファイル読込 読込元:{CONFIG_BUCKET_NAME}/{RECEIVE_MONTHLY_FILE_NAME_LIST_PATH}') receive_monthly_file_name_obj = s3_resource.Object(CONFIG_BUCKET_NAME, RECEIVE_MONTHLY_FILE_NAME_LIST_PATH) receive_monthly_file_name_response = receive_monthly_file_name_obj.get() - info_log('I-03-02', '日次I/Fファイルネーム設定ファイルを読み込みました') + print_log(LOG_INFO, 'I-03-02', '月次I/Fファイルネーム設定ファイルを読み込みました') except Exception as e: - error_log('E-03-01', '日次I/Fファイルネーム設定ファイルの読み込みに失敗しました') + print_log(LOG_ERROR, 'E-03-01', '月次I/Fファイルネーム設定ファイルの読み込みに失敗しました') error_process('E-03-01', e) # ④ 月次I/Fファイル受領通知処理を行う - info_log('I-04-01', '月次I/Fファイル受領通知処理開始') - - info_log('I-04-02', f'受領したファイル名:{event_file_name}') - info_log('I-04-03', '受領したファイル名と月次I/Fファイルネーム設定ファイルの突き合わせを開始します') - file_exsit = False - for row in io.TextIOWrapper(io.BytesIO(receive_monthly_file_name_response["Body"].read()), encoding='utf-8'): - match_result = re.fullmatch(row[0], event_file_name) + print_log(LOG_INFO, 'I-04-01', '月次I/Fファイル受領通知処理開始') + print_log(LOG_INFO, 'I-04-02', f'受領したファイル名:{event_file_name}') + print_log(LOG_INFO, 'I-04-03', '受領したファイル名と月次I/Fファイルネーム設定ファイルの突き合わせを開始します') + file_exists = False + receive_monthly_file_name_body = io.TextIOWrapper(io.BytesIO(receive_monthly_file_name_response["Body"].read()), encoding='utf-8') + for row in csv.reader(receive_monthly_file_name_body, delimiter='\t'): + match_result = re.fullmatch(row[INDEX_REGEX], event_file_name) if match_result is not None: - file_exsit = True + file_exists = True break - if file_exsit == True: - info_log('I-04-04', '月次I/Fを受領しました') - mail_msg = f'  {row[1]} {event_file_name}\n' + if file_exists == True: + print_log(LOG_INFO, 'I-04-04', f'月次I/Fを受領しました ファイル名:{row[INDEX_DATA_NAME]} {event_file_name}') + mail_msg = f'{mail_msg}  {row[INDEX_DATA_NAME]} {event_file_name}\n' else: - info_log('I-04-05', '受領したファイルは月次I/Fではありませんでした') + print_log(LOG_INFO, 'I-04-05', '受領したファイルは月次I/Fではありませんでした') - # ⑤ メール通知本文に出力内容が存在するか確認する - info_log('I-05-01', 'メール送信処理開始') + # ⑤ 「①」でメモリ保持しているメール挿入用文言に出力内容が存在するか確認する + print_log(LOG_INFO, 'I-05-01', 'メール送信処理開始') if len(mail_msg) > 0: # 1.存在した場合 - info_log('I-05-02', '月次I/Fファイルを受領したため、メール送信処理を開始します') + print_log(LOG_INFO, 'I-05-02', '月次I/Fファイルを受領したため、メール送信処理を開始します') try: - info_log('I-05-03', f'通知メール(タイトル)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{NOTICE_MAIL_TITLE_TEMPLATE_PATH}') + print_log(LOG_INFO, 'I-05-03', f'通知メール(タイトル)テンプレートファイル読込 読込元:{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') - info_log('I-05-04', '通知メール(タイトル)テンプレートファイルを読み込みました') + print_log(LOG_INFO, 'I-05-04', '通知メール(タイトル)テンプレートファイルを読み込みました') except Exception as e: - error_log('E-05-01', '通知メール(タイトル)テンプレートファイルの読み込みに失敗しました') + print_log(LOG_ERROR, 'E-05-01', '通知メール(タイトル)テンプレートファイルの読み込みに失敗しました') error_process('E-05-01', e) try: - info_log('I-05-05', f'通知メール(本文)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{NOTICE_MAIL_BODY_TEMPLATE_PATH}') + print_log(LOG_INFO, 'I-05-05', f'通知メール(本文)テンプレートファイル読込 読込元:{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) - info_log('I-05-06', '通知メール(本文)テンプレートファイルを読み込みました') + print_log(LOG_INFO, 'I-05-06', '通知メール(本文)テンプレートファイルを読み込みました') except Exception as e: - error_log('E-05-02', '通知メール(本文)テンプレートファイルの読み込みに失敗しました') + print_log(LOG_ERROR, 'E-05-02', '通知メール(本文)テンプレートファイルの読み込みに失敗しました') error_process('E-05-02', e) - info_log('I-05-07', f'メール送信指示をします 送信先トピック:{MBJ_SAP_NOTICE_TOPIC}') + print_log(LOG_INFO, 'I-05-07', f'メール送信指示をします 送信先トピック:{MBJ_SAP_NOTICE_TOPIC}') params = { 'TopicArn': MBJ_SAP_NOTICE_TOPIC, 'Subject': mail_title, 'Message': mail_body } sns_client.publish(**params) - info_log('I-05-08', 'メール送信指示をしました') + print_log(LOG_INFO, 'I-05-08', 'メール送信指示をしました') else: # 2.存在しない場合 - info_log('I-05-09', '受領したファイルは月次I/Fファイルではないため、メール送信処理をスキップします') + print_log(LOG_INFO, 'I-05-09', '受領したファイルは月次I/Fファイルではないため、メール送信処理をスキップします') # ⑥ 処理終了ログを出力する - info_log('I-06-01', '処理終了 SAP_supデータ月次I/F受領通知処理') + print_log(LOG_INFO, 'I-06-01', '処理終了 SAP_supデータ月次I/F受領通知処理') except Exception as e: - error_log('E-99', f'想定外のエラーが発生しました エラー内容:{e}') + print_log(LOG_ERROR, 'E-99', f'想定外のエラーが発生しました エラー内容:{e}') error_process('E-99', e) -def info_log(log_id, msg): +def print_log(log_level, log_id, msg): try: - print(f'{datetime.now():%Y-%m-%d %H:%M:%S} Info {log_id} {msg}') + print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} {log_level} {log_id} {msg}') except Exception as e: - error_log('E-99', f'想定外のエラーが発生しました エラー内容:{e}') - error_process('E-99', e) - - -def error_log(log_id, msg): - try: - print(f'{datetime.now():%Y-%m-%d %H:%M:%S} Error {log_id} {msg}') - except Exception as e: - print(f'{datetime.now():%Y-%m-%d %H:%M:%S} Error E-99 想定外のエラーが発生しました エラー内容:{e}') + print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-99 想定外のエラーが発生しました エラー内容:{e}') error_process('E-99', e) def error_process(error_log_id, exception): try: - print(f'{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-01 エラー処理開始') - print(f'{datetime.now():%Y-%m-%d %H:%M:%S} Error E-ERR-02 処理異常通知の送信指示をしました 通知先トピック:{NDS_NOTICE_TOPIC}') + 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, @@ -145,8 +140,8 @@ def error_process(error_log_id, exception): } sns_client.publish(**params) - print(f'{datetime.now():%Y-%m-%d %H:%M:%S} Error E-ERR-03 エラー終了 処理を中断します') + print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-ERR-03 エラー終了 処理を中断します') sys.exit() except Exception as e: - print(f'{datetime.now():%Y-%m-%d %H:%M:%S} Error E-99 想定外のエラーが発生しました エラー内容:{e}') + print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-99 想定外のエラーが発生しました エラー内容:{e}') sys.exit()