【问题标题】:python: logging sending stdout to log [duplicate]python:记录发送标准输出到日志[重复]
【发布时间】:2016-09-11 18:55:19
【问题描述】:
import logging
import sys

log_fmt = 'brbuild: %(message)s'
# Initilaize log here
# TODO may need to flush
logging.basicConfig(filename="logtest",
                    level=logging.DEBUG,
                    format=log_fmt,
                    datefmt='%H:%M:%S',
                    filemode='a')

# capture stdout to log
ch = logging.StreamHandler(sys.stdout)
ch.setLevel(logging.DEBUG)
log_fmt = logging.Formatter(log_fmt)
ch.setFormatter(log_fmt)
logging.getLogger("logtest").addHandler(ch)

logging.info("using logging")
print "using stdout"

日志测试

brbuild: using logging

我怎样才能让"using stdout" 也写入日志?

【问题讨论】:

  • 你必须记录它。 logging.info("使用标准输出")
  • @agconti 我希望能够将标准输出发送到日志中......即,无论我使用什么打印它都会进入日志。
  • 我认为 Streamhandler 可以做到这一点,但它似乎没有工作..
  • @valentjedi 是的,第二个答案有效!

标签: python python-2.7 logging


【解决方案1】:

这是一种 hack,但您可以在当前模块中重新定义 print,而其他模块可以执行 from foo import print 以便能够使用它。

为简单起见,我在该示例中没有使用文件句柄,而是使用 stdout/stderr。如果您使用文件,您仍然可以将sys.stdout.write(msg+os.linesep) 语句添加到新的print 函数中。

我的新 print 可能不如原来的 print 强大,但它也支持多个参数。

import logging,sys

def print(*args):
    logger.info(" ".join([str(x) for x in args]))

if __name__ == '__main__':
    logger = logging.getLogger('foo')
    logger.addHandler(logging.StreamHandler(sys.stdout))
    logger.addHandler(logging.StreamHandler(sys.stderr))
    logger.setLevel(logging.INFO)
    a=12
    logger.info('1. This should appear in both stdout and stderr.')
    print("logging works!",a)

(你必须用括号使用它)。结果:

1. This should appear in both stdout and stderr.
1. This should appear in both stdout and stderr.
logging works! 12
logging works! 12

【讨论】:

    【解决方案2】:

    如果您的意图是将print 输出(即重定向sys.stdout)重定向到记录器,或同时到记录器和标准输出,您将需要创建一个模拟类文件对象的类来执行并将该类文件对象类的实例分配给 sys.stdout。

    【讨论】: