import logging import queue import threading import time from logging.handlers import TimedRotatingFileHandler from PySide6.QtCore import Signal, QObject import os # class QTextLogger(logging.Handler): # def __init__(self): # super().__init__() # def emit(self, record): # pass class LoggingService(QObject): # log_info_signal = Signal(str) # log_warning_signal = Signal(str) # log_error_signal = Signal(str) def __init__(self): super().__init__() # self.logger_textEdit_info = logging.getLogger('info_logger') # self.logger_textEdit_info.setLevel(logging.INFO) # self.logger_textEdit_warning = logging.getLogger('warning_logger') # self.logger_textEdit_warning.setLevel(logging.WARNING) self.logger_file_info = logging.getLogger('file_logger') self.logger_file_info.setLevel(logging.INFO) self.log_queue = queue.Queue() self.logger_thread = threading.Thread(target=self._process_logs, daemon=True,name="util_log") self.logger_thread.start() def init_log(self,file_path): # text_edit_handler = QTextLogger() # formatter = logging.Formatter('%(asctime)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S') # text_edit_handler.setFormatter(formatter) # self.logger_textEdit_info.addHandler(text_edit_handler) # text_edit_handler_warning = QTextLogger() # formatter_warning = logging.Formatter('%(asctime)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S') # text_edit_handler_warning.setFormatter(formatter_warning) # self.logger_textEdit_warning.addHandler(text_edit_handler_warning) # 确保日志目录存在 log_dir = os.path.dirname(file_path) if log_dir and not os.path.exists(log_dir): os.makedirs(log_dir, exist_ok=True) handler = TimedRotatingFileHandler(file_path, when='D', interval=1, backupCount=30,encoding='utf-8') handler.suffix = "%Y-%m-%d" formatter = logging.Formatter('%(asctime)s - %(levelname)s- %(message)s', datefmt='%Y-%m-%d %H:%M:%S') handler.setLevel(logging.INFO) handler.setFormatter(formatter) self.logger_file_info.addHandler(handler) # 添加错误专用日志文件 error_handler = TimedRotatingFileHandler( file_path.replace('.log', '_error.log'), when='D', interval=1, backupCount=30, encoding='utf-8') error_handler.suffix = "%Y-%m-%d" error_handler.setLevel(logging.ERROR) # 只处理错误级别 error_handler.setFormatter(formatter) self.logger_file_info.addHandler(error_handler) def _process_logs(self): while True: time.sleep(0.1) level, message = self.log_queue.get() if level == logging.INFO: # self.log_info_signal.emit(message) self.logger_file_info.info(message) elif level == logging.ERROR: self.logger_file_info.error(message) # self.log_error_signal.emit(message) elif level == logging.WARNING: self.logger_file_info.warning(message) # self.log_warning_signal.emit(message) def log_message(self,level,message): self.log_queue.put((level, message)) logging_service = LoggingService()