AutoPercenty3/logger_module_pyside6.py

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)