Resell1/modules/logger.py

49 lines
1.8 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에 로그 메시지를 전달하는 콜백 함수 (여기서는 단순 텍스트 메시지)
"""
self.gui_callback = gui_callback
self.logger = logging.getLogger(logger_name)
self.logger.setLevel(level)
# 파일 핸들러 (최대 10MB, 5회 백업)
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)
self.log("Logger initialized", level=logging.DEBUG)
def log(self, message, level=logging.INFO, exc_info=False):
if exc_info:
message += "\n" + traceback.format_exc()
self.logger.log(level, message)
if self.gui_callback:
# HTML 태그 없이 순수 텍스트를 전달합니다.
self.gui_callback(message)
# 편의 메서드 추가
def debug(self, message):
self.log(message, level=logging.DEBUG)
def info(self, message):
self.log(message, level=logging.INFO)
def warning(self, message):
self.log(message, level=logging.WARNING)
def error(self, message):
self.log(message, level=logging.ERROR)
def get_logger(gui_callback=None):
return Logger(gui_callback=gui_callback)