52 lines
2.0 KiB
Python
52 lines
2.0 KiB
Python
import logging
|
|
from logging.handlers import RotatingFileHandler
|
|
import traceback
|
|
|
|
class Logger:
|
|
def __init__(self, gui_callback=None, log_file="app.log", logger_name="FletLogger", level=logging.DEBUG):
|
|
"""
|
|
gui_callback: GUI에 로그 메시지를 전달하는 콜백 함수 (매개변수: formatted_message:str)
|
|
"""
|
|
self.gui_callback = gui_callback
|
|
self.logger = logging.getLogger(logger_name)
|
|
self.logger.setLevel(level)
|
|
# 파일 핸들러 설정 (RotatingFileHandler)
|
|
file_handler = RotatingFileHandler(log_file, maxBytes=10*1024*1024, backupCount=5, encoding="utf-8")
|
|
file_handler.setLevel(level)
|
|
formatter = logging.Formatter("[%(asctime)s] [%(levelname)s] %(message)s")
|
|
file_handler.setFormatter(formatter)
|
|
self.logger.addHandler(file_handler)
|
|
# 콘솔 핸들러 설정
|
|
console_handler = logging.StreamHandler()
|
|
console_handler.setLevel(level)
|
|
console_handler.setFormatter(formatter)
|
|
self.logger.addHandler(console_handler)
|
|
|
|
def log(self, message, level=logging.INFO, exc_info=False):
|
|
"""
|
|
메시지를 기록하고, GUI 콜백이 있다면 레벨별 색상이 적용된 HTML 문자열을 전달합니다.
|
|
"""
|
|
if exc_info:
|
|
message += "\n" + traceback.format_exc()
|
|
self.logger.log(level, message)
|
|
if self.gui_callback:
|
|
formatted_message = self.format_gui_message(message, level)
|
|
self.gui_callback(formatted_message)
|
|
|
|
def format_gui_message(self, message, level):
|
|
"""
|
|
레벨별 색상을 적용한 HTML 문자열 반환.
|
|
"""
|
|
color_map = {
|
|
logging.DEBUG: "gray",
|
|
logging.INFO: "black",
|
|
logging.WARNING: "orange",
|
|
logging.ERROR: "red",
|
|
logging.CRITICAL: "purple"
|
|
}
|
|
color = color_map.get(level, "black")
|
|
return f'<span style="color:{color};">{message}</span>'
|
|
|
|
def get_logger(gui_callback=None):
|
|
return Logger(gui_callback=gui_callback)
|