Files
AutoControlSystem-G/Util/util_log.py

103 lines
3.8 KiB
Python
Raw Normal View History

2025-07-29 13:16:30 +08:00
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()
2025-09-28 09:48:12 +08:00
self.logger_thread = threading.Thread(target=self._process_logs, daemon=True,name="util_log")
2025-07-29 13:16:30 +08:00
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)
2025-09-10 09:16:57 +08:00
handler = TimedRotatingFileHandler(file_path, when='D', interval=1, backupCount=30,encoding='utf-8')
2025-07-29 13:16:30 +08:00
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)
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()