forked from huangxin/ailai
103 lines
3.8 KiB
Python
103 lines
3.8 KiB
Python
|
|
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)
|
||
|
|
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)
|
||
|
|
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()
|