我有一个用Python编写的复杂代码,它有很多线程和许多try-catch块。我正在使用 Python 的线程模块来处理我的线程。有没有一种 Python 内置的方法来知道我的线程退出的原因和时间?我的代码中存在一些竞争条件,我无法缩小范围。在线程退出时显式地在每个块或打印时间打印错误会增加我不希望的大量日志记录。
基于此的信息日志记录示例,包含所需的所有信息,您可以更改格式并添加/删除属性以获取要在输出日志中显示的更多/更少信息。
import logging
class ConnInfo:
def __getitem__(self, name):
"""
To allow this instance to look like a dict.
"""
from random import choice
if name == 'ip':
result = choice(['127.0.0.1', '192.168.0.1'])
else:
result = self.__dict__.get(name, '?')
return result
def __iter__(self):
keys = ['ip', 'user']
keys.extend(self.__dict__.keys())
return keys.__iter__()
if __name__ == '__main__':
from random import choice
levels = (logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR, logging.CRITICAL)
a1 = logging.LoggerAdapter(logging.getLogger('a.b.c'),
{ 'ip' : '123.231.231.123', 'user' : 'sheila' })
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)-15s %(name)-5s %(levelname)-8s IP: %(ip)-15s Thread: %(threadName)s: %(message)s')
a1.debug('A debug message')
a1.info('An info message with %s', 'some parameters')
a2 = logging.LoggerAdapter(logging.getLogger('d.e.f'), ConnInfo())
for x in range(10):
lvl = choice(levels)
lvlname = logging.getLevelName(lvl)
a2.log(lvl, 'A message at %s level with %d %s', lvlname, 2, 'parameters')
输出: 2016-07-07 09:13:46,255 a.b.c 调试 IP: 123.231.231.123 线程:
主线程:调试消息 2016-07-07 09:13:46,256 a.b.c 信息 IP:
123.231.231.123 线程: 主线程: 带有一些参数的信息消息 2016-07-07 09:13:46,256 d.e.f 关键 IP: 192.168.0.1
线程:主线程:具有 2 个参数
的临界级别的消息 2016-07-07 09:13:46,256 d.e.f 关键 IP:127.0.0.1 线程:
主线程:具有 2 个参数的临界级别的消息 2016-07-07
09:13:46,256 d.e.f 警告 IP:192.168.0.1 线程:主线程:A
带有 2 个参数的警告级别的消息 2016-07-07 09:13:46,256
d.e.f 错误 IP: 127.0.0.1 线程: 主线程: 消息在
错误级别与 2 参数 2016-07-07 09:13:46,256 d.e.f 信息
IP:127.0.0.1 线程:主线程:信息级别消息,2
参数 2016-07-07 09:13:46,256 D.E.F 关键 IP:192.168.0.1
线程:主线程:具有 2 个参数
的临界级别的消息 2016-07-07 09:13:46,256 d.e.f 警告 IP: 192.168.0.1 线程:
主线程:具有 2 个参数的警告级别的消息 2016-07-07
09:13:46,256 d.e.f 关键 IP:127.0.0.1 线程:主线程:A
具有 2 个参数的临界级别的消息 2016-07-07 09:13:46,256
d.e.f 调试 IP:192.168.0.1 线程:主线程:一条消息在
具有 2 个参数的调试级别 2016-07-07 09:13:46,256 d.e.f 警告
IP: 192.168.0.1 线程: 主线程: 警告级别的
消息 带 2 个参数