我有一个大程序,需要很长的时间,需要充分的日志记录。我有一个位于前端的GUI,其中包含一个自定义日志处理程序,定义如下:class QHandler(logging.Handler, QTextEdit):
def __init__(self, parent=None):
QTextEdit.__init__(self, parent)
logging.Handler.__init__(self)
self.setLineWrapMode(QTextEdit.NoWrap)
self.setReadOnly(True)
self.emit_lock = Lock()
def emit(self, record):
with self.emit_lock:
self.append(self.format(record))
self.autoScroll()
def format(self, record):
if (record.levelno <= logging.INFO):
bgcolor = WHITE
fgcolor = BLACK
if (record.levelno <= logging.WARNING):
bgcolor = YELLOW
fgcolor = BLACK
if (record.levelno <= logging.ERROR):
bgcolor = ORANGE
fgcolor = BLACK
if (record.levelno <= logging.CRITICAL):
bgcolor = RED
fgcolor = BLACK
else:
bgcolor = BLACK
fgcolor = WHITE
self.setTextBackgroundColor(bgcolor)
self.setTextColor(fgcolor)
self.setFont(DEFAULT_FONT)
record = logging.Handler.format(self, record)
return record
def autoScroll(self):
self.verticalScrollBar().setSliderPosition(self.verticalScrollBar().maximum())
我有主gui(QMainWindow),它通过以下方式添加此处理程序:
^{pr2}$
我有一个控制器函数,它通过以下方式初始化日志处理程序:# inside controller initializing function
gui = gui_class() # this is the main gui that initializes the handler among other things
logger = logging.getLogger()
gui.status_handler.setFormatter(file_formatter) # defined elsewhere
logger.addHandler(gui.status_handler)
一旦启动GUI并初始化日志记录,我将使用以下命令完成python执行:app = QApplication.instance()
if (app is None):
app = QApplication([])
app.setStyle('Fusion')
app.exec_()
GUI有几个插槽连接到按钮信号,按钮信号产生线程来进行实际处理。每个处理线程都有它自己的日志记录调用,似乎可以按预期工作。它们的定义如下:class Subprocess_Thread(Thread):
def __init__(self, ):
Thread.__init__(self)
self.logger = logging.getLogger(self.__class__.__name__)
self.logger.info('Subprocess Thread Created')
def run(self):
# does a bunch of stuff
self.logger.info('Running stuff')
# iterates over other objects and calls on them to do stuff
# where they also have a logger attached and called just like above
当我在没有GUI或者最小化GUI的情况下运行我的应用程序时,它每次都运行得很好。我可以在控制台中看到我的日志消息(命令提示符或spyder)。在
如果我在不最小化GUI的情况下运行同一个应用程序,我将在GUI中看到初始化的日志消息和线程化进程的一些最初部分,但随后它将在看似随机的时间挂起。没有错误消息,CPU使用率似乎已达到使用的单个核心的最大值。我添加了一个锁,只是为了确保logging不是从不同的线程传入的,但这也没有帮助。在
我试过去a QPlainTextEdit和QListWidget,但每次都遇到同样的问题。在
有人知道为什么这个GUI元素会导致整个Python解释器在视图中挂起并且消息被记录到其中吗?在