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
写在日志中?
这是一种黑客攻击,但是你可以在当前模块中重新定义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。斯特杜特。