提问者:小点点

Python:日志发送stdout到日志[重复]


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

我怎么能得到使用stdout写在日志中?


共2个答案

匿名用户

这是一种黑客攻击,但是你可以在当前模块中重新定义print,其他模块可以从foo导入print执行来使用它。

为了简单起见,在那个示例中我没有使用文件句柄,而是使用了stdout/stderr。如果使用文件,仍然可以添加sys。斯特杜特。将(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

匿名用户

如果您打算将打印输出重定向(即重定向sys.stdout)到记录器,或重定向到记录器和标准输出,则需要创建一个类来模拟类文件对象,并将该类文件对象的实例分配给sys。斯特杜特。