我有一个Logger类,其中包含以下内容:
angular.element(document).ready(function(){
angular.element('.datepicker-class').removeAttr('aria-required')
})
主要内容如下:
class Logger():
def __init__(self):
self.terminal = sys.__stdout___
self.log = open('logFile.log', 'w')
def write(message):
self.terminal.write(message)
self.log.write(message)
在File1中:
import Logger, sys
sys.stdout = Logger.Logger()
import File1
File1.aFunc()
文件2中的:
def execSubProc(target,queue):
target(queue)
q = multiprocess.Queue()
proc = multiprocess.Process(target=execSubProc, args=(testFunc,q))
proc.start()
proc.join()
好的,这是我的结构。我想要做的是从运行testFunc()的子进程获取stdout并将其放入队列。当程序返回main时,我想从队列中读取并将这些内容写入日志文件。
我不能再次在文件2中执行sys.stdout = Logger.Logger(),因为这只会覆盖主电源日志文件。如何捕获所有子进程stdout并放入队列?
答案 0 :(得分:1)
一种解决方案可能是使用logging
模块
记录器在multiprocessing.util
中是不可取的,可用于生成线程安全日志:
import time
import logging
import multiprocessing as mp
import multiprocessing.util as util
from sys import stdout as out
def runner(ids):
log = util.get_logger()
for i in range(10):
time.sleep(.5)
log.log(25, 'Process {} logging {}'.format(ids, i))
if __name__ == '__main__':
# Setup the logger
log = util.get_logger()
log.getEffectiveLevel()
# You can setup a file instead of stdout in the StreamHandler
ch = logging.StreamHandler(out)
ch.setLevel(25)
ch.setFormatter(logging.Formatter('%(processName)s - %(message)s'))
log.addHandler(ch)
log.setLevel(25)
p1 = mp.Process(target=runner, args=(1,), name="Process1")
p2 = mp.Process(target=runner, args=(2,), name="Process2")
p1.start()
p2.start()
time.sleep(2)
log.log(25, 'Some main process logging meanwhile')
p1.join()
级别> 20允许避免让日志启动和停止进程
如果参数out是一个打开的可写文件,Handler可以直接登录文件
这样可以避免自己处理日志队列。 logging
模块中还有许多其他高级功能。
使用multiprocessing
模块中的记录器来获取线程安全日志非常重要。