python log stderr和stdout到一个文件

时间:2013-06-13 11:33:31

标签: python logging stdout stderr

只是想在这上面挑选你的大脑。我有几个子进程在运行,我想将stderr和stdout打印到一个文件。到目前为止我已经这样做了:

def write_to_stderr_log(process):
    stderr= open("stderr.log", "w")
    proc_err = process.communicate()
    print >> stderr, proc_err
    stderr.close()

def write_to_stdout_log(process):
    stdout = open("stdout.log", "w")
    proc_out = process.communicate()
    print >> stdout, proc_out
    stdout.close()

def logger():
    logger = logging.getLogger('error_testing')
    hdlr = logging.FileHandler('error.log')
    formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
    hdlr.setFormatter(formatter)
    logger.addHandler(hdlr)
    logger.setLevel(logging.WARNING)

    logger.error('We have a problem')
    logger.debug('debugging')
    logger.info('some info')

logger()
proc = subprocess.Popen(['FastTree -nt test.fasta'], bufsize=512, stdin = None, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell=True) 

write_to_stderr_log(proc)
write_to_stdout_log(proc)

这是最好的方法吗?如果我有多个进程,我想它会重新写入日志文件,这可能是个问题。在这里欣赏一些建议。感谢

1 个答案:

答案 0 :(得分:0)

我很确定您可以将自己的file个实例作为subprocess.Popen的关键字提供。

>>> out = open('stdout.log', 'wb')
>>> err = open('stderr.log', 'wb')
>>> child = subprocess.Popen('FastTree -nt test.fasta', stdin=None, stdout=out,
                             stderr=err)
>>> rc = child.wait()
>>> out.close()
>>> err.close()

以下是重要的subprocess.Popen文件部分:

  

stdin stdout stderr 分别指定执行程序的标准输入,标准输出和标准错误文件句柄。有效值为PIPEDEVNULL,现有文件描述符(正整数),现有文件对象NonePIPE表示应创建到子项的新管道。 DEVNULL表示将使用特殊文件os.devnull。使用默认设置None,不会发生重定向;子项的文件句柄将从父项继承。此外,stderr可以是STDOUT,表示应将应用程序中的stderr数据捕获到与stdout相同的文件句柄中。