Python 如何向来自多处理工作人员的日志行添加上下文信息?

Python 如何向来自多处理工作人员的日志行添加上下文信息?,python,logging,multiprocessing,Python,Logging,Multiprocessing,我有一个工作进程池(使用multiprocessing.pool),并希望将这些进程记录到单个日志文件中。我知道日志服务器、系统日志等,但它们似乎都需要对我的应用程序的安装、监控、日志处理等进行一些更改,我希望避免这些更改 我正在Linux上使用CPython2.6 最后,我偶然发现了一个几乎对我有用的方法。基本思想是启动日志侦听器进程,在它和工作进程之间设置一个队列,工作进程登录到队列中(使用QueueHandler),然后侦听器将日志行格式化并序列化为文件 根据上面链接的解决方案,到目前为止

我有一个工作进程池(使用
multiprocessing.pool
),并希望将这些进程记录到单个日志文件中。我知道日志服务器、系统日志等,但它们似乎都需要对我的应用程序的安装、监控、日志处理等进行一些更改,我希望避免这些更改

我正在Linux上使用CPython2.6

最后,我偶然发现了一个几乎对我有用的方法。基本思想是启动日志侦听器进程,在它和工作进程之间设置一个队列,工作进程登录到队列中(使用
QueueHandler
),然后侦听器将日志行格式化并序列化为文件

根据上面链接的解决方案,到目前为止,这一切都在起作用

但是我想让工作人员为每个日志行记录一些上下文信息,例如作业令牌。在
pool.apply_async()
方法中,我可以传递我想要记录的上下文信息。请注意,我只对工人从事特定工作时的上下文信息感兴趣;当它空闲时,如果工作人员想要记录某些内容,则不应该有任何上下文信息。因此,日志侦听器的日志格式基本上如下所示:

"%(job_token)s %(process)d %(asctime)s %(msg)"
工作人员应该在日志记录中提供
job\u token
作为上下文信息(其他格式说明符是标准的)

我已经看过了。使用自定义筛选器,我可以在作业启动时创建筛选器,并将筛选器应用于根记录器,但我使用的是创建自己的记录器的第三方模块(通常在模块导入时),而我的自定义筛选器不应用于它们


有没有办法在上述设置中实现这一点?或者是否有其他方法可以实现这一点(请记住,我仍然希望使用单个日志文件,没有单独的日志服务器,工作日志行的特定于作业的上下文信息)?

筛选器可以应用于处理程序和记录程序-因此您可以将筛选器应用于队列处理程序。如果此处理程序附加到您流程中的根记录器,则第三方模块的任何日志记录也应由该处理程序处理,因此您也应该在这些记录的事件中获取上下文。

我最后做了一些稍微不同的事情,因此我还没有实际验证它是否有效。然而,根据我对日志模块的理解,它似乎应该可以工作,因此给出了答案。