如何将上下文信息添加到多处理工作者的日志行中?

时间:2011-07-06 06:51:33

标签: python logging multiprocessing

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

我在Linux上使用CPython 2.6。

最后我偶然发现了solution,这几乎对我有用。基本思想是启动一个日志监听器进程,在它和工作进程之间建立一个队列,然后工作人员登录队列(使用QueueHandler),然后监听器将日志行格式化和序列化为一份文件。

根据上面提到的解决方案,到目前为止这都是有效的。

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

"%(job_token)s %(process)d %(asctime)s %(msg)"

并且工作人员应该在日志记录中提供job_token作为上下文信息(其他格式说明符是标准的)。

我看过custom log filters。使用自定义过滤器,我可以在作业启动时创建过滤器并将过滤器应用于根记录器,但我使用第三方模块创建自己的记录器(通常在模块导入时),并且我的自定义过滤器不应用于它们

有没有办法在上面的设置中使这个工作?或者是否有其他方法可以使这项工作(请记住,我仍然更喜欢单个日志文件,没有单独的日志服务器,工作日志行的特定于作业的上下文信息)?

1 个答案:

答案 0 :(得分:0)

过滤器可以应用于处理程序和记录器 - 因此您只需将过滤器应用于QueueHandler即可。如果此处理程序附加到进程中的根记录器,则第三方模块的任何日志记录也应由处理程序处理,因此您也应该在这些已记录的事件中获取上下文。