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

Python 如何在每个线程的基础上实现日志记录?,python,logging,python-multithreading,Python,Logging,Python Multithreading,我想将单个线程中的日志放入一个只包含该线程日志的特定文件中 在大多数情况下,将所有线程的日志记录到一个文件中是完全令人满意的。这对我不起作用。我将一个并发模型应用于一个大型的、当前迭代的代码库,该代码库在不同的模块中实现了日志记录,并且我正在尝试尽可能少地更改代码 我可以想出几个解决方案,这些解决方案似乎有点老套,涉及到检测当前代码是否在线程中执行,因此我想知道是否有一种很好的Pythonic方法来做到这一点。如果您已经在使用日志记录模块,那么它非常简单。你应该有这样的东西: log = log

我想将单个线程中的日志放入一个只包含该线程日志的特定文件中

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


我可以想出几个解决方案,这些解决方案似乎有点老套,涉及到检测当前代码是否在线程中执行,因此我想知道是否有一种很好的Pythonic方法来做到这一点。

如果您已经在使用
日志记录
模块,那么它非常简单。你应该有这样的东西:

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!')
我们将转到您的
日志。格式化程序
并添加
%(线程)d
%(线程名称)s
和presto!你有一个线程感知记录器

同样,它看起来是这样的:

logging.Formatter('%(thread)d - %(threadName)s - %(levelname)s - %(message)s')
然后
grep
it。瞧!不需要改变任何其他东西


如果您感兴趣,这里是所有这些工具:

您是否能够格式化日志以添加线程id?如果你这样做,如果你想最小化对主应用程序的代码更改,你可以使用grep在日志中过滤掉它。当然可以,但是假设线程从5个不同的模块调用5个不同的函数,我希望这些函数最终出现在线程日志中,这些函数如何使用特殊的格式化程序/处理程序登录到同一个记录器?请看刚才发布的答案。这是您的理想方法,代码更改最少。谢谢!这对我来说是个新闻,尽管它仍然不能完全解决我的问题。(尽管仍然是一个很大的帮助)逻辑上,我们可以假设每个线程一行一行地打印一篇单独的杂志文章,因此不可能同时阅读任何文章。为了将它们放入单独的文件中,我必须根据线程名称进行解析,这对我的情况来说不是100%理想,部分原因是我实际上使用的是工作线程,因此1个线程可能处理3个“文章”。此外,我可以更改一些系统范围的日志记录,只是如果我正在对其进行黑客攻击,我也可以更改每个工作项的线程名称,但这是黑客行为,不允许我进行任何级别的控制。您可以添加新的
logging.FileHandler
,为每个线程添加一个新的
日志记录并更改名称,但这需要你改变一些事情。再添加一点代码,但最后会有一个X文件,其中包含每个线程的输出..我可以给你一个例子,但我需要看看你是如何使用线程的。您需要发布一个小代码buddy;)要添加的代码太多,如果我这样做了,只会使它更加混乱,我将添加一种新类型的处理程序,它基本上检测我们是否正在使用线程,并为该线程创建或使用一个文件流。有点像有一个文件处理程序列表。谢谢你的指路人!