Python日志记录从多个进程重定向标准输出
我试图捕获许多进程的stderr和stdout,并使用python日志模块将它们的输出写入日志文件。下面的代码似乎实现了这一点。目前,我轮询每个进程stdout,如果有任何数据,则写入记录器。有没有更好的办法 此外,我还希望拥有所有单个processese活动的主日志,换句话说,我希望自动(无需轮询)将每个进程的所有stdout/stderr写入主日志记录器。这可能吗 谢谢Python日志记录从多个进程重定向标准输出,python,logging,redirect,stdout,pipe,Python,Logging,Redirect,Stdout,Pipe,我试图捕获许多进程的stderr和stdout,并使用python日志模块将它们的输出写入日志文件。下面的代码似乎实现了这一点。目前,我轮询每个进程stdout,如果有任何数据,则写入记录器。有没有更好的办法 此外,我还希望拥有所有单个processese活动的主日志,换句话说,我希望自动(无需轮询)将每个进程的所有stdout/stderr写入主日志记录器。这可能吗 谢谢 class MyProcess: def __init__(self, process_name , param):
class MyProcess:
def __init__(self, process_name , param):
self.param = param
self.logfile = logs_dir + "Display_" + str(param) + ".log"
self.args = [process_name, str(param)]
self.logger_name = process_name + str(param)
self.start()
self.logger = self.initLogger()
def start(self):
self.process = Popen(self.args, bufsize=1, stdout=PIPE, stderr=STDOUT) #line buffered
# make each processes stdout non-blocking
fd = self.process.stdout
fl = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)
def initLogger(self):
f = logging.Formatter("%(levelname)s -%(name)s - %(asctime)s - %(message)s")
fh = logging.handlers.RotatingFileHandler(self.logfile, maxBytes=max_log_file_size, backupCount = 10)
fh.setFormatter(f)
logger = logging.getLogger(self.logger_name)
logger.setLevel(logging.DEBUG)
logger.addHandler(fh) #file handler
return logger
def getOutput(self): #non blocking read of stdout
try:
return self.process.stdout.readline()
except:
pass
def writeLog(self):
line = self.getOutput()
if line:
self.logger.debug(line.strip())
#print line.strip()
process_name = 'my_prog'
num_processes = 10
processes=[]
for param in range(num_processes)
processes.append(MyProcess(process_name,param))
while(1):
for p in processes:
p.writeLog()
sleep(0.001)
你的选择是
- 非阻塞I/O:这就是您所做的:)
- The:您可以使用
或poll()
为不同的输入分派读取select()
- 线程:为要监视的每个文件描述符创建一个线程,并使用阻塞I/O。对于大量的文件描述符,这是不可取的,但至少它可以在Windows上工作
- 第三方库:显然,您也可以使用或进行异步文件访问,但我从未这样做过
select.select()
至于您关于主记录器的问题:因为您想要对单个输出进行测试,所以不能将所有内容重定向到主记录器。您必须手动执行此操作