Python:将打印输出(stdout)重定向到具有多处理功能的日志记录

时间:2018-11-30 09:03:36

标签: python logging stdout python-multiprocessing

我正在研究一个Python类,该类使用我们自己开发的其他一些类/模块。

我们在每个模块中使用一些印刷品来向用户提示一些信息(日志记录也用于获取更详细的信息)。 问题是,当“主”类使用(子)模块时,打印内容可能会过多,并隐藏基本的主信息。在我当前的应用程序中,“主”是一种遗传算法,使用了一个多处理子类(用于运行案例),该子类还使用其他一些子类(用于运行非python代码,定义初始化数据等)。每个班级都会打印与该班级相关的信息,而我只想显示硕士的信息。

我尝试将sys.stdout和sys.stderr重定向到日志记录。见下文,我尝试一个简化的例子。

被调用的模块

from multiprocessing import Process

def send2disp(text) :
    print(text)
    return

def send2disp_mp(text) :
    workers = [Process(target=send2disp,args=(text+str(pi),)) for pi in range(2)]
    for ti in workers :
        ti.start()
    for ti in workers :
        ti.join()

if __name__ == '__main__':
    pass

主脚本

from test_print import send2disp,send2disp_mp #'test_print' is the module filename
import logging
import sys

if __name__ == '__main__':

    send2disp('NoRedirection->OnStdout')

    logging.basicConfig(filename='test.log',level=logging.DEBUG,filemode='w')
    logging.info('OnLog')

    fl = logging.getLoggerClass().root.handlers[0].stream

    sys.stdout = fl
    sys.stderr = fl    

    print('InScript->IsOnLog')

    send2disp('SubModule->IsOnLog')
    send2disp_mp('ShouldBeOnlog')

使用主脚本,我定义一个日志文件并将stdout / stderr重定向到该文件。然后,我调用子模块的两个函数:

  • 'send2disp'效果很好,打印输出进入日志
  • 相反,
  • 'send2disp_mp'继续将打印输出发送到stdout ...唯一的区别是使用多处理,这应该是问题的根源。

如何处理重定向标准输出和多处理? 预先感谢。

0 个答案:

没有答案