如何在每个线程的基础上实现日志记录?

How do I implement logging on a per-thread basis?

我想将来自单个线程的日志获取到只包含来自该线程的日志的特定文件中。

在大多数情况下,将所有线程的日志记录到一个文件中就完全令人满意了。这对我不起作用。我正在将并发模型应用于一个大型且当前迭代的代码库,该代码库在不同的模块中到处都实现了日志记录,并且我正在尝试更改尽可能少的代码。

我能想到几个看起来有点老套的解决方案,它们涉及检测当前代码是否在线程中执行,所以我想知道是否有一个很好的 Pythonic 方法来执行此操作。

如果您已经在使用 logging 模块,那非常简单。你应该有这样的东西:

log = logging.getLogger(__name__)
log.setLevel(logging.DEBUG)
file_handler = logging.FileHandler('mylog.log')
file_handler.setFormatter(logging.Formatter('%(message)s'))
log.addHandler(file_handler)

log.debug('this is awesome!')

好吧,去你的 logging.Formatter 添加 %(thread)d%(threadName)s 吧!你有一个线程感知记录器!

再一次,它看起来像这样:

logging.Formatter('%(thread)d - %(threadName)s - %(levelname)s - %(message)s')

然后.. grep它。瞧!无需更改任何其他内容。

如果您有兴趣,这里是所有这些:https://docs.python.org/2/library/logging.html#logrecord-attributes