簡體   English   中英

python日志與多處理,根記錄器在Windows中不同

[英]python logging with multiprocessing, root logger different in windows

我嘗試使用多處理進行日志記錄,並在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>

如果我在主腳本中初始化根記錄器,如何在windows下保留子進程中的級別等設置?

在我看來,這可能與以下與平台相關的行為有關

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

(......)

全局變量

請記住,如果在子進程中運行的代碼嘗試訪問全局變量,那么它看到的值(如果有)可能與調用Process.start時父進程中的值不同。

但是,僅僅是模塊級常量的全局變量不會引起任何問題。

從您的問題,我認為這導致logging.basicConfig()調用沒有到達您的所有進程。 解決此問題的方法是讓您的子進程登錄到Queue (使用QueueHandler ),並在主進程中有一個專用線程來偵聽隊列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM