diff --git a/workspace/process_directory.py b/workspace/process_directory.py index 382c19a..0a89e8d 100644 --- a/workspace/process_directory.py +++ b/workspace/process_directory.py @@ -13,21 +13,38 @@ from dotenv import load_dotenv logger = logging.getLogger(__name__) def setup_logger(): - """로거를 설정하여 콘솔과 파일에 모두 출력하도록 합니다.""" - logger.setLevel(logging.INFO) # 로거의 최소 레벨 설정 + """ + 로거를 설정하여 콘솔과 고유한 타임스탬프를 가진 파일에 모두 출력하도록 합니다. + 로그 파일은 'workspace' 디렉터리 내에 저장됩니다. + """ + # 기존에 추가된 핸들러가 있다면 제거하여 중복 로깅 방지 + for handler in logger.handlers[:]: + logger.removeHandler(handler) - # 로그 포맷 지정 + logger.setLevel(logging.INFO) formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') - # 콘솔 핸들러 설정 + # 콘솔 핸들러 console_handler = logging.StreamHandler() console_handler.setFormatter(formatter) logger.addHandler(console_handler) - # 파일 핸들러 설정 (예: 'script_run.log' 파일에 저장) - file_handler = logging.FileHandler('script_run.log', encoding='utf-8') + # 고유한 파일명을 위한 타임스탬프 생성 + timestamp = time.strftime("%Y%m%d_%H%M%S") + log_filename = f"{timestamp}_script_run.log" + + # 로그 파일을 workspace 디렉터리 안에 생성 + workspace_dir = os.path.dirname(__file__) + log_filepath = os.path.join(workspace_dir, log_filename) + + # 파일 핸들러 + file_handler = logging.FileHandler(log_filepath, encoding='utf-8') file_handler.setFormatter(formatter) logger.addHandler(file_handler) + + # 생성된 로그 파일 경로를 로깅 + logger.info(f"로그 파일이 '{log_filepath}'에 생성되었습니다.") + # --- API 요청 함수 --- @@ -45,7 +62,6 @@ def start_extraction(post_url, file_path, filename, headers, model_name=None): return response.json() except Exception: - # logger.exception은 오류의 상세 정보(traceback)까지 기록해줍니다. logger.exception(f"[{filename}] POST 요청 중 오류 발생") return None @@ -100,7 +116,7 @@ def main(): dotenv_path = os.path.join(os.path.dirname(__file__), '.env') load_dotenv(dotenv_path=dotenv_path) - # 로거를 가장 먼저 설정합니다. + # 로거를 가장 먼저 설정 setup_logger() # 환경 변수에서 API 정보 가져오기 @@ -132,13 +148,16 @@ def main(): logger.info(f"요청 API: {post_url}") logger.info(f"입력 디렉터리: {args.input_dir}") logger.info(f"출력 디렉터리: {args.output_dir}") - - for filename in sorted(os.listdir(args.input_dir)): - file_path = os.path.join(args.input_dir, filename) - if not os.path.isfile(file_path): - continue - logger.info(f"--- 처리 시작: {filename} ---") + # 처리할 파일 목록 준비 + files_to_process = [f for f in sorted(os.listdir(args.input_dir)) if os.path.isfile(os.path.join(args.input_dir, f))] + total_files = len(files_to_process) + logger.info(f"총 {total_files}개의 파일을 처리합니다.") + + for i, filename in enumerate(files_to_process): + file_path = os.path.join(args.input_dir, filename) + + logger.info(f"--- ({i+1}/{total_files}) 처리 시작: {filename} ---") initial_response = start_extraction(post_url, file_path, filename, headers, args.model_name) if not initial_response: @@ -173,5 +192,4 @@ if __name__ == "__main__": try: main() except KeyboardInterrupt: - # KeyboardInterrupt는 main 밖에서 처리해야 할 수 있으므로 로거를 직접 호출 - logging.getLogger(__name__).warning("사용자에 의해 작업이 중단되었습니다.") + logging.getLogger(__name__).warning("사용자에 의해 작업이 중단되었습니다.") \ No newline at end of file