[英]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.