진행상태, 유니크로그 저장방식 추가

This commit is contained in:
2025-08-01 10:10:54 +09:00
parent b040cda75e
commit fcc0ad808c

View File

@@ -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("사용자에 의해 작업이 중단되었습니다.")