python:日志记录发送stdout到log

2024-09-30 08:16:38 发布

您现在位置:Python中文网/ 问答频道 /正文

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"

对数检验

^{pr2}$

如何让"using stdout"也写入日志?在


Tags: todebugimportlogmessagehereloggingstdout
2条回答

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

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

{{cd1}可能不支持多个新的参数。在

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)

(必须用括号括起来)。结果:

^{pr2}$

如果您的意图是将print输出(即重定向sys.stdout)重定向到logger,或者重定向到logger和标准输出,则需要创建一个类来模拟类似文件的对象来完成此操作,并将该类文件类的一个实例分配给系统标准输出. 在

相关问题 更多 >

    热门问题