import logging import os from logging.handlers import RotatingFileHandler from PyQt5.QtCore import pyqtSignal, QObject def setup_logger(name, log_file, level=logging.DEBUG, max_bytes=20*1024*1024, backup_count=5): """로거 설정을 위한 함수""" formatter = logging.Formatter('%(asctime)s - %(filename)s:%(lineno)d - %(name)s - %(levelname)s - %(message)s') # RotatingFileHandler를 사용하여 로그 파일 설정 handler = RotatingFileHandler(log_file, maxBytes=max_bytes, backupCount=backup_count, encoding='utf-8') handler.setFormatter(formatter) logger = logging.getLogger(name) logger.setLevel(level) logger.addHandler(handler) # 콘솔 로그 출력을 위한 핸들러가 이미 추가되었는지 확인 if not any(isinstance(h, logging.StreamHandler) for h in logger.handlers): console_handler = logging.StreamHandler() console_handler.setFormatter(formatter) console_handler.setLevel(level) logger.addHandler(console_handler) return logger class QTextEditLogger(logging.Handler, QObject): appendHtml = pyqtSignal(str) # HTML 메시지를 전달할 시그널 정의 scrollToBottom = pyqtSignal() # 스크롤을 최하단으로 이동시키는 시그널 def __init__(self): logging.Handler.__init__(self) QObject.__init__(self) def emit(self, record): msg = self.format(record) # 로그 레코드를 문자열로 포매팅 color = { logging.DEBUG: "black", logging.INFO: "grey", logging.WARNING: "orange", logging.ERROR: "red", logging.CRITICAL: "purple", }.get(record.levelno, "black") # HTML 스타일을 적용한 메시지 생성 message = f"{msg}
" self.appendHtml.emit(message) # HTML 메시지로 변경 self.scrollToBottom.emit() # 스크롤 시그널 발생 def close(self): self.flush() logging.Handler.close(self) def flush(self): pass # 필요 시 정리 작업 수행