python:将stdout发送到日志

时间:2016-09-11 18:55:20

标签: python python-2.7 logging

C-c C-b

logtest

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

2 个答案:

答案 0 :(得分:0)

这是一种黑客行为,但您可以在当前模块中重新定义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

答案 1 :(得分:-1)

如果您打算将print输出(即重定向sys.stdout)重定向到记录器,或者记录器和标准输出,您需要创建一个模仿文件的类 - 喜欢做对象并将该文件类对象类的实例分配给sys.stdout。