72 lines
2.8 KiB
Python
72 lines
2.8 KiB
Python
import logging
|
|
from logging.handlers import RotatingFileHandler
|
|
from PySide6.QtCore import Signal, QObject, Slot
|
|
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=10*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):
|
|
"""QPlainTextEdit에 로그 메시지를 출력하는 커스텀 핸들러"""
|
|
log_signal = Signal(str) # 로그 메시지를 전달하기 위한 시그널
|
|
|
|
def __init__(self, plain_text_edit: QTextEdit):
|
|
super(QTextEditLogger).__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: logging.LogRecord):
|
|
|
|
try:
|
|
log_message = 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};\">{log_message}</span><br/>"
|
|
|
|
# 시그널을 통해 메인 스레드에서 UI 업데이트 요청
|
|
self.log_signal.emit(log_message)
|
|
|
|
# self.plain_text_edit.moveCursor(QTextCursor.End)
|
|
|
|
except Exception as e:
|
|
print(f"Log emit error: {e}") # 디버깅용 메시지 출력
|
|
|
|
@Slot(str)
|
|
def append_log(self, message: str):
|
|
"""QPlainTextEdit에 로그 메시지를 추가"""
|
|
# self.plain_text_edit.appendPlainText(message)
|
|
self.plain_text_edit.append(message)
|
|
self.plain_text_edit.moveCursor(QTextCursor.End)
|