Python与多处理日志logging,根logging器在Windows中不同

我尝试使用多处理进行日志logging,并在Windows下发现,在subprocess中我将得到不同的根logging器,但在Linux下,这是可以的。

testing代码:

main.py:

#!/usr/bin/env python # -*- coding: utf-8 -*- import logging import multiprocessing from mymod import func def m_func(): server = multiprocessing.Process(target=func, args=()) server.start() logger = logging.getLogger() #print 'in global main: ', logger if __name__ == '__main__': print 'in main: ', logger m_func() 

mymod.py:

 #!/usr/bin/env python # -*- coding: utf-8 -*- import logging logger = logging.getLogger() # print 'in global func: ', logger def func(): print 'in func: ', logger 

在Linux下,结果是:

 in main: <logging.RootLogger object at 0x10e4d6d90> in func: <logging.RootLogger object at 0x10e4d6d90> 

但在Windows 7,64位下,我将在main和func之间得到不同的根logging器:

 in main: <logging.RootLogger object at 0x00000000021FFD68> in func: <logging.RootLogger object at 0x00000000023BC898> 

如果我在主脚本中初始化根logging器,如何在Windows下的subprocess中保存级别等设置?

在我看来,这可能与以下平台相关的行为有关 :

16.6.3.2。 Windows由于Windows缺少os.fork(),因此它有一些额外的限制:

(……)

全局变量

请记住,如果在子进程中运行的代码尝试访问全局变量,那么它所看到的值(如果有)可能与Process.start被调用时父进程中的值不同。

但是,仅仅是模块级常量的全局变量不会造成任何问题。

从你的问题,我认为这会导致logging.basicConfig()调用没有达到你所有的进程。 解决方案是让您的子进程登录到一个Queue (使用QueueHandler ),并在您的主进程中有一个专用线程来监听队列。