[Python] 효율적인 로깅과 종료 코드 관리: 싱글톤 로거, 오류 처리, 그리고 통합 시스템
- 싱글톤 패턴을 활용한 로깅 시스템 → 애플리케이션 전반에서 일관된 로깅 제공
- 종료 코드 관리 시스템 → 오류 발생 시 프로그램의 종료 상태를 명확하게 전달
- 로깅과 종료 코드의 통합 → 오류 상황을 분석하여 적절한 종료 코드를 자동 설정
2. 싱글톤 패턴을 활용한 로깅 시스템 ** **2.1 싱글톤 패턴의 필요성 ** 로깅 시스템은 애플리케이션 전반에서 일관된 방식으로 로그를 남기고 관리해야 합니다.
이를 위해 싱글톤 패턴을 적용하면, 하나의 로거 인스턴스를 생성하여 모든 모듈에서 재사용할 수 있습니다.
2.2 싱글톤 로거 구현 ** 아래는 Python에서 메타클래스 기반 싱글톤 로거를 구현한 예제입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import sys
import os
from datetime import datetime
class Singleton(type):
"""싱글톤 패턴을 적용한 메타클래스"""
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super().__call__(*args, **kwargs)
return cls._instances[cls]
class Logger(metaclass=Singleton):
"""싱글톤 로거"""
def __init__(self, log_file=None):
if not hasattr(self, 'initialized'):
self.terminal = sys.stdout
self.log_file = log_file or self._create_log_file()
self.error_occurred = False
self.error_messages = []
self.initialized = True # 중복 초기화 방지
def _create_log_file(self):
log_dir = "logs"
os.makedirs(log_dir, exist_ok=True)
timestamp = datetime.now().strftime('%Y-%m-%d_%H-%M-%S')
return open(os.path.join(log_dir, f"log_{timestamp}.log"), "w", encoding="utf-8")
def write(self, message):
"""콘솔과 로그 파일에 동시에 출력"""
self.terminal.write(message)
self.log_file.write(message)
self.log_file.flush()
def info(self, message):
self.write(f"[INFO] {message}\n")
def error(self, message):
self.error_occurred = True
if message not in self.error_messages:
self.error_messages.append(message)
self.write(f"[ERROR] {message}\n")
def has_errors(self):
return self.error_occurred
# 싱글톤 로거 사용 예제
logger = Logger()
logger.info("프로그램이 시작되었습니다.")
logger.error("예상치 못한 오류 발생!")
- 애플리케이션 전반에서 일관된 로깅 가능
- 메모리 절약 (불필요한 인스턴스 생성 방지)
- 설정이 중앙에서 한 번만 관리되므로 유지보수 용이
3. 효과적인 종료 코드 관리 시스템 ** **3.1 종료 코드(Exit Code)의 중요성 ** 프로그램이 종료될 때 반환하는 종료 코드(exit code) 는 프로그램의 실행 결과를 나타냅니다.
| 종료 코드 | 의미 |
|---|---|
| 0 | 정상 종료 |
| 1 | 일반 오류 발생 |
| 2 | 사용자가 프로그램을 강제 종료 (Ctrl+C) |
| 3 | API 할당량 초과 오류 |
| 4 | 인증 오류 (예: 401 Unauthorized) |
| 5 | 심각한 오류로 실행 불가 |
CI/CD 파이프라인, 자동화된 스크립트에서 종료 코드를 활용하면
오류 상황을 자동으로 감지하고 대응할 수 있습니다.
3.2 종료 코드 관리 시스템 구현 ** 아래는 Python에서 종료 코드를 중앙에서 관리하는 예제입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class ExitCodeManager:
"""종료 코드를 중앙에서 관리하는 클래스"""
SUCCESS = 0
GENERAL_ERROR = 1
KEYBOARD_INTERRUPT = 2
API_QUOTA_ERROR = 3
AUTH_ERROR = 4
CRITICAL_ERROR = 5
def __init__(self):
self.exit_code = self.SUCCESS
def set_code(self, code):
self.exit_code = code
def get_code(self):
return self.exit_code
def reset(self):
self.exit_code = self.SUCCESS
- 모든 종료 코드가 일관된 기준을 따름
- 로깅 시스템과 연계하여 오류 발생 시 자동으로 적절한 종료 코드 설정 가능
- 오류가 발생했을 때, 종료 코드가 자동으로 설정되도록 하면 개발자가 직접 오류 분류를 신경 쓸 필요 없음.
- 로깅 메시지를 분석하여 종료 코드 설정 → 디버깅 및 문제 해결이 쉬워짐.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class EnhancedLogger:
"""로깅과 종료 코드 관리를 통합한 로거"""
def __init__(self):
self.exit_code_manager = ExitCodeManager()
self.error_occurred = False
def info(self, message):
print(f"[INFO] {message}")
def error(self, message):
self.error_occurred = True
print(f"[ERROR] {message}")
# 메시지 내용에 따라 종료 코드 설정
if "quota_exceeded" in message.lower():
self.exit_code_manager.set_code(ExitCodeManager.API_QUOTA_ERROR)
elif "unauthorized" in message.lower():
self.exit_code_manager.set_code(ExitCodeManager.AUTH_ERROR)
else:
self.exit_code_manager.set_code(ExitCodeManager.GENERAL_ERROR)
def get_exit_code(self):
return self.exit_code_manager.get_code()
# 사용 예시
logger = EnhancedLogger()
logger.info("작업 시작")
logger.error("API 할당량 초과! (quota_exceeded)")
exit_code = logger.get_exit_code()
print(f"프로그램 종료 코드: {exit_code}")
- 오류가 자동으로 종료 코드와 연결됨
- 로깅과 종료 코드 관리가 일관되게 유지됨
- CI/CD, 자동화 환경에서 오류 상태를 쉽게 추적 가능
5. 결론 ** **🔥 핵심 요약 **
싱글톤 로거를 활용하면 모든 모듈에서 일관된 로깅을 사용할 수 있다.
종료 코드 관리 시스템을 구축하면 오류 유형별로 적절한 종료 코드를 설정할 수 있다.
로깅과 종료 코드를 통합하면 프로그램의 오류 처리를 자동화하고 유지보수를 쉽게 할 수 있다.
이러한 방식으로 시스템을 구성하면 효율적이고 견고한 오류 처리 및 로깅 시스템을 구축할 수 있으며, 특히 자동화 환경(CI/CD, 데이터 파이프라인, 배치 작업)에서 큰 이점을 제공합니다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

