import logging import queue import threading import time from logging.handlers import TimedRotatingFileHandler from PySide6.QtCore import Signal, QObject class QTextEditLogger(logging.Handler): def __init__(self, text_widget): super().__init__() self.widget = text_widget def emit(self, record): # 格式化日志信息 log_message = self.format(record) # 在主线程中更新 QTextEdit self.widget.append(log_message) class Logger(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.pre_message = '' self.lock = threading.Lock() # 创建锁 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,textEdit_info,textEdit_warning,file_path): text_edit_handler = QTextEditLogger(textEdit_info) 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 = QTextEditLogger(textEdit_warning) 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) 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.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_textEdit_info.info(message) self.logger_file_info.info(message) elif level == logging.ERROR: # self.logger_textEdit_info.error(message) self.logger_file_info.error(message) # self.logger_textEdit_warning.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)) return try: with self.lock: # 确保线程安全 if message == self.pre_message: return self.pre_message = message if level == logging.INFO: self.logger_textEdit_info.info(message) #return self.logger_file_info.info(message) if level == logging.ERROR: self.logger_textEdit_info.error(message) self.logger_textEdit_warning.error(message) self.logger_file_info.error(message) if level == logging.WARNING: #return self.logger_file_info.warning(message) except Exception as e: print(e) log = Logger()