python日志与多处理,根记录器在Windows中不同

时间:2016-01-11 15:04:41

标签: python windows logging multiprocessing

我尝试使用多处理进行日志记录,并在Windows下找到,我将在子进程中获得不同的根记录器,但在Linux下可以。

测试代码:

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之间获得不同的根记录器:

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

如果我在主脚本中初始化root logger,如何在windows下保留子进程中的level等设置?

1 个答案:

答案 0 :(得分:3)

在我看来,这可能与the following platform-dependant behaviour

有关
  

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

     

(...)

     

全局变量

     

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

     

但是,只是模块级常量的全局变量会导致   没问题。

根据您的问题,我认为这导致logging.basicConfig()调用无法到达您的所有流程。解决此问题的方法是让您的子进程记录到Queue(使用QueueHandler),并在主进程中有一个专用线程来监听队列。