diff --git a/app.py b/app.py index 05df8cd..c42edcd 100644 --- a/app.py +++ b/app.py @@ -1,11 +1,15 @@ from flask import Flask, render_template, request, jsonify, session, redirect, url_for import os +import logging from functools import wraps from datetime import datetime from utils.word_processor import WordProcessor from utils.google_drive import GoogleDriveUploader from config import Config +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + app = Flask(__name__) app.config.from_object(Config) @@ -29,17 +33,24 @@ drive_uploader = None try: # credentials.json 파일이 있는 경우에만 초기화 시도 if os.path.exists(app.config['GOOGLE_DRIVE_CREDENTIALS_FILE']): + logger.info( + "구글 드라이브 업로더 초기화 시도 | credentials=%s token=%s", + app.config['GOOGLE_DRIVE_CREDENTIALS_FILE'], + app.config['GOOGLE_DRIVE_TOKEN_FILE'], + ) drive_uploader = GoogleDriveUploader( app.config['GOOGLE_DRIVE_CREDENTIALS_FILE'], app.config['GOOGLE_DRIVE_TOKEN_FILE'] ) + logger.info("구글 드라이브 업로더 초기화 성공") + else: + logger.info("credentials.json이 없어 구글 드라이브 업로더를 초기화하지 않았습니다.") except FileNotFoundError: - # 인증 파일이 없으면 조용히 넘어감 - pass + logger.warning("구글 드라이브 인증 파일을 찾을 수 없습니다. 업로드 기능 비활성화.") except Exception as e: # 브라우저 관련 오류나 기타 오류는 조용히 처리 # 서버 환경에서는 브라우저가 없을 수 있으므로 정상적인 상황 - pass + logger.warning("구글 드라이브 초기화 중 오류 발생: %s", str(e)) @app.route('/auth', methods=['GET', 'POST']) def auth(): @@ -157,12 +168,15 @@ def step5(): # 구글 드라이브 업로드 if drive_uploader and app.config['GOOGLE_DRIVE_FOLDER_ID']: + upload_filename = f"교리점검표_{all_data['basic_info'].get('name', '무명')}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.docx" + logger.info("구글 드라이브 업로드 시도 | file=%s, folder=%s", upload_filename, app.config['GOOGLE_DRIVE_FOLDER_ID']) try: file_id = drive_uploader.upload_file( output_path, - f"교리점검표_{all_data['basic_info'].get('name', '무명')}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.docx", + upload_filename, app.config['GOOGLE_DRIVE_FOLDER_ID'] ) + logger.info("구글 드라이브 업로드 성공 | file_id=%s", file_id) # 업로드 후 로컬 파일 삭제 (선택사항) # os.remove(output_path) return jsonify({ @@ -171,6 +185,7 @@ def step5(): 'file_id': file_id }) except Exception as e: + logger.warning("구글 드라이브 업로드 실패: %s", str(e)) # 업로드 실패 시 로컬 파일 경로 반환 return jsonify({ 'success': True, diff --git a/utils/google_drive.py b/utils/google_drive.py index 0b607b3..7ad70ff 100644 --- a/utils/google_drive.py +++ b/utils/google_drive.py @@ -1,4 +1,5 @@ import os +import logging from google.oauth2.credentials import Credentials from google_auth_oauthlib.flow import InstalledAppFlow from google.auth.transport.requests import Request @@ -7,6 +8,13 @@ from googleapiclient.http import MediaFileUpload import pickle SCOPES = ['https://www.googleapis.com/auth/drive.file'] +logger = logging.getLogger(__name__) +if not logger.handlers: + handler = logging.StreamHandler() + formatter = logging.Formatter('%(asctime)s [%(levelname)s] %(name)s - %(message)s') + handler.setFormatter(formatter) + logger.addHandler(handler) +logger.setLevel(logging.INFO) class GoogleDriveUploader: def __init__(self, credentials_file, token_file): @@ -18,16 +26,20 @@ class GoogleDriveUploader: def _authenticate(self): """구글 드라이브 인증""" creds = None + logger.info("구글 드라이브 인증 시작 | credentials=%s token=%s", self.credentials_file, self.token_file) # 기존 토큰 파일이 있으면 로드 if os.path.exists(self.token_file): with open(self.token_file, 'rb') as token: creds = pickle.load(token) + logger.info("기존 토큰 파일 로드 성공") # 유효한 인증 정보가 없으면 새로 인증 if not creds or not creds.valid: if creds and creds.expired and creds.refresh_token: + logger.info("토큰 만료, refresh 시도") creds.refresh(Request()) + logger.info("토큰 refresh 성공") else: if not os.path.exists(self.credentials_file): raise FileNotFoundError( @@ -39,7 +51,9 @@ class GoogleDriveUploader: self.credentials_file, SCOPES) # 서버 환경에서는 브라우저가 없을 수 있으므로 예외 처리 try: + logger.info("로컬 서버 플로우로 인증 시도") creds = flow.run_local_server(port=0) + logger.info("로컬 서버 플로우 인증 성공") except Exception as e: # 브라우저를 열 수 없는 경우 (서버 환경 등) # 토큰 파일이 이미 있다면 재시도하지 않고 예외 발생 @@ -51,8 +65,10 @@ class GoogleDriveUploader: # 토큰 저장 with open(self.token_file, 'wb') as token: pickle.dump(creds, token) + logger.info("토큰 파일 저장 완료: %s", self.token_file) self.service = build('drive', 'v3', credentials=creds) + logger.info("구글 드라이브 서비스 생성 완료") def upload_file(self, file_path, file_name, folder_id=None): """파일을 구글 드라이브에 업로드""" @@ -63,6 +79,7 @@ class GoogleDriveUploader: if folder_id: file_metadata['parents'] = [folder_id] + logger.info("구글 드라이브 업로드 준비 | file=%s, name=%s, folder=%s", file_path, file_name, folder_id) media = MediaFileUpload(file_path, mimetype='application/vnd.openxmlformats-officedocument.wordprocessingml.document') file = self.service.files().create( @@ -71,5 +88,7 @@ class GoogleDriveUploader: fields='id' ).execute() - return file.get('id') + file_id = file.get('id') + logger.info("구글 드라이브 업로드 성공 | file_id=%s", file_id) + return file_id