我有一个Python脚本,使得使用“打印”的打印到标准输出。 我已经通过Python记录仪最近添加日志记录,并想使它所以这些打印语句去,如果启用记录,记录器。 我不想修改或删除这些打印语句。
我可以通过做“log.info(‘一些信息味精’),”登陆。 我希望能够做这样的事情:
if logging_enabled:
sys.stdout=log.info
print("test")
如果启用日志记录,“测试”应该被记录为,如果我没有log.info(“测试”)。 如果没有启用日志记录,“测试”应该只是被打印到屏幕上。
这可能吗? 我知道我可以将stdout以类似的方式文件(见: 重定向打印日志文件 )
还有一个方法是将包裹记录器在调用转换为对象write
至记录仪的log
方法。
渡轮Boender不只是这一点, 在GPL许可下提供的一个职位上他的网站 :
import logging
import sys
class StreamToLogger(object):
"""
Fake file-like stream object that redirects writes to a logger instance.
"""
def __init__(self, logger, log_level=logging.INFO):
self.logger = logger
self.log_level = log_level
self.linebuf = ''
def write(self, buf):
for line in buf.rstrip().splitlines():
self.logger.log(self.log_level, line.rstrip())
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s:%(levelname)s:%(name)s:%(message)s',
filename="out.log",
filemode='a'
)
stdout_logger = logging.getLogger('STDOUT')
sl = StreamToLogger(stdout_logger, logging.INFO)
sys.stdout = sl
stderr_logger = logging.getLogger('STDERR')
sl = StreamToLogger(stderr_logger, logging.ERROR)
sys.stderr = sl
这使您可以轻松地将所有输出到您选择的一个记录。 如果需要的话,可以节省sys.stdout
和/或sys.stderr
代替它,如果你需要在以后恢复它以前在这个线程被别人提到。
当然,你既可以打印到标准输出,并追加到一个日志文件,如下所示:
# Uncomment the line below for python 2.x
#from __future__ import print_function
import logging
logging.basicConfig(level=logging.INFO, format='%(message)s')
logger = logging.getLogger()
logger.addHandler(logging.FileHandler('test.log', 'a'))
print = logger.info
print('yo!')
一个更简单的选项,
import logging, sys
logging.basicConfig(filename='path/to/logfile', level=logging.DEBUG)
logger = logging.getLogger()
sys.stderr.write = logger.error
sys.stdout.write = logger.info
你真的应该做的是另一种方式:通过调整你的日志记录配置使用print
报表或别的东西,这取决于设置。 不要覆盖print
(如由您或他人使用您的模块),可实际上它输出到行为,一些可能在未来出台的设置stdout
,你就会有问题。
有是应该日志信息重定向到适当的流(文件,处理stdout
或其他任何类似文件)。 这就是所谓的StreamHandler
,它捆绑了logging
模块。
所以基本上,我认为你应该做的,你说你不想做的事:更换print
与实际日志记录语句。
一旦你定义了你的记录,用此来进行打印重定向记录仪打印的,即使多发的参数。
print = lambda *tup : logger.info(str(" ".join([str(x) for x in tup])))