【问题标题】:python logging with multiprocessing, root logger different in windows具有多处理功能的python日志记录,Windows中不同的根记录器
【发布时间】:2016-04-15 22:41:27
【问题描述】:

我尝试使用多处理进行日志记录,发现在 windows 下,我会在子进程中获得不同的 root logger,但在 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 之间得到不同的 root logger:

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

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

【问题讨论】:

    标签: python windows logging multiprocessing


    【解决方案1】:

    在我看来,这可以链接到the following platform-dependant behaviour

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

    (...)

    全局变量

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

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 2020-03-27
    • 2020-11-19
    相关资源
    最近更新 更多