AutoPercenty3/logger_module_pyside6.py

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)