import logging from logging.handlers import RotatingFileHandler import traceback class Logger: def __init__(self, gui_callback=None, log_file="app.log", logger_name="FletLogger", level=logging.DEBUG): """ gui_callback: GUI에 로그 메시지를 전달하는 콜백 함수 (매개변수: formatted_message:str) """ self.gui_callback = gui_callback self.logger = logging.getLogger(logger_name) self.logger.setLevel(level) # 파일 핸들러 설정 (RotatingFileHandler) file_handler = RotatingFileHandler(log_file, maxBytes=10*1024*1024, backupCount=5, encoding="utf-8") file_handler.setLevel(level) formatter = logging.Formatter("[%(asctime)s] [%(levelname)s] %(message)s") file_handler.setFormatter(formatter) self.logger.addHandler(file_handler) # 콘솔 핸들러 설정 console_handler = logging.StreamHandler() console_handler.setLevel(level) console_handler.setFormatter(formatter) self.logger.addHandler(console_handler) def log(self, message, level=logging.INFO, exc_info=False): """ 메시지를 기록하고, GUI 콜백이 있다면 레벨별 색상이 적용된 HTML 문자열을 전달합니다. """ if exc_info: message += "\n" + traceback.format_exc() self.logger.log(level, message) if self.gui_callback: formatted_message = self.format_gui_message(message, level) self.gui_callback(formatted_message) def format_gui_message(self, message, level): """ 레벨별 색상을 적용한 HTML 문자열 반환. """ color_map = { logging.DEBUG: "gray", logging.INFO: "black", logging.WARNING: "orange", logging.ERROR: "red", logging.CRITICAL: "purple" } color = color_map.get(level, "black") return f'{message}' def get_logger(gui_callback=None): return Logger(gui_callback=gui_callback)