84 lines
3.4 KiB
Python
84 lines
3.4 KiB
Python
import logging
|
|
from logging.handlers import RotatingFileHandler
|
|
from PySide6.QtCore import Signal, QObject
|
|
from PySide6.QtWidgets import QTextEdit
|
|
# from PySide6.QtWidgets import QPlainTextEdit
|
|
from PySide6.QtGui import QTextCursor
|
|
|
|
import sys, os
|
|
|
|
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
|
|
|
|
def get_base_dir():
|
|
"""
|
|
실행 환경에 따라 base_dir을 설정하는 메서드.
|
|
cx_Freeze로 패키징된 경우 실행 파일의 경로, 일반 Python 환경일 경우 __file__을 기준으로 설정.
|
|
"""
|
|
if getattr(sys, 'frozen', False): # 패키징된 경우
|
|
base_dir = os.path.dirname(sys.executable)
|
|
internal_dir = os.path.join(base_dir, '_internal') # _internal 디렉토리 포함
|
|
if os.path.exists(internal_dir): # _internal 디렉토리가 존재하면 base_dir로 설정
|
|
return internal_dir
|
|
|
|
else: # 일반 Python 실행 환경
|
|
base_dir = os.path.dirname(os.path.abspath(__file__))
|
|
return base_dir
|
|
class QPlainTextEditLogger(logging.Handler, QObject):
|
|
"""QPlainTextEdit에 로그 메시지를 출력하는 커스텀 핸들러"""
|
|
log_signal = Signal(str) # 로그 메시지를 전달하기 위한 시그널
|
|
|
|
def __init__(self, plain_text_edit: QTextEdit):
|
|
super().__init__() # logging.Handler와 QObject 초기화
|
|
logging.Handler.__init__(self)
|
|
QObject.__init__(self)
|
|
self.plain_text_edit = plain_text_edit
|
|
self.log_signal.connect(self.append_log)
|
|
|
|
def emit(self, record):
|
|
"""로그 메시지를 처리하고 시그널로 전달"""
|
|
try:
|
|
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 스타일을 적용한 메시지 생성
|
|
log_message = f"<span style=\"color:{color};\">{msg}</span><br/>"
|
|
|
|
# HTML 메시지 추가 및 커서를 끝으로 이동
|
|
self.plain_text_edit.append(log_message)
|
|
# self.plain_text_edit.append("") # 줄바꿈 추가
|
|
self.plain_text_edit.moveCursor(QTextCursor.End)
|
|
|
|
except Exception as e:
|
|
print(f"Log emit error: {e}") # 디버깅용 메시지 출력
|
|
|
|
|
|
def append_log(self, message: str):
|
|
"""QPlainTextEdit에 로그 메시지를 추가"""
|
|
self.plain_text_edit.appendPlainText(message)
|