7

我正在使用QtCore.QThread(来自PyQt4)。

要记录,我还使用以下格式化程序:

logging.Formatter('%(levelname)-8s %(asctime)s %(threadName)-15s %(message)s')

结果日志是:

调试 2012-10-01 03:59:31,479 Dummy-3 my_message

我的问题是我想更明确地知道哪个线程正在记录......Dummy-3对我来说不是最明确的名字......

有没有办法将名称设置为QtCore.QThread日志模块可用的名称(作为 LogRecord 属性),以便使日志更有意义?

谢谢 !

4

2 回答 2

5

如果线程模块可用,日志模块将用于threading.current_thread().name设置threadNameLogRecord 属性。

但是文档说如果当前线程不是由线程模块创建的(因此是“Dummy-x”名称) ,threading.current_thread则将使用一个虚拟线程对象。

我想可以通过猴子补丁threading.current_thread将名称重置为更合适的名称。但肯定更好的方法是extra在记录消息时使用字典:

logging.Formatter('%(levelname)-8s %(asctime)s %(qthreadname)-15s %(message)s')
...
extras = {'qthreadname': get_qthreadname()}
logging.warning(message, extra=extras)
于 2012-10-01T13:01:44.780 回答
0

Qt5 文档中,您可以调用setObjectName()来修改线程名称

要选择线程的名称(例如,在 Linux 上由命令 ps -L 标识),您可以在启动线程之前调用 setObjectName()。

如果您不调用 setObjectName(),则为线程指定的名称将是线程对象的运行时类型的类名(例如,在 Mandelbrot 示例中为“RenderThread”,因为这是QThread 子类)。

不幸的是,它还指出:

这目前不适用于 Windows 上的发布版本。

于 2020-06-23T08:59:40.987 回答