重定向Python的“打印”输出到记录仪(Redirect Python 'print

2019-06-25 15:17发布

我有一个Python脚本,使得使用“打印”的打印到标准输出。 我已经通过Python记录仪最近添加日志记录,并想使它所以这些打印语句去,如果启用记录,记录器。 我不想修改或删除这些打印语句。

我可以通过做“log.info(‘一些信息味精’),”登陆。 我希望能够做这样的事情:

if logging_enabled:
  sys.stdout=log.info
print("test")

如果启用日志记录,“测试”应该被记录为,如果我没有log.info(“测试”)。 如果没有启用日志记录,“测试”应该只是被打印到屏幕上。

这可能吗? 我知道我可以将stdout以类似的方式文件(见: 重定向打印日志文件 )

Answer 1:

你有两个选择:

  1. 打开日志文件,并用它代替sys.stdout的,而不是一个函数:

     log = open("myprog.log", "a") sys.stdout = log >>> print("Hello") >>> # nothing is printed because it goes to the log file instead. 
  2. 与你的日志功能更换打印:

     # If you're using python 2.x, uncomment the next line #from __future__ import print_function print = log.info >>> print("Hello!") >>> # nothing is printed because log.info is called instead of print 


Answer 2:

还有一个方法是将包裹记录器在调用转换为对象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代替它,如果你需要在以后恢复它以前在这个线程被别人提到。



Answer 3:

当然,你既可以打印到标准输出,并追加到一个日志文件,如下所示:

# 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!')


Answer 4:

一个更简单的选项,

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


Answer 5:

你真的应该做的是另一种方式:通过调整你的日志记录配置使用print报表或别的东西,这取决于设置。 不要覆盖print (如由您或他人使用您的模块),可实际上它输出到行为,一些可能在未来出台的设置stdout ,你就会有问题。

有是应该日志信息重定向到适当的流(文件,处理stdout或其他任何类似文件)。 这就是所谓的StreamHandler ,它捆绑了logging模块。

所以基本上,我认为你应该做的,你说你不想做的事:更换print与实际日志记录语句。



Answer 6:

一旦你定义了你的记录,用此来进行打印重定向记录仪打印的,即使多发的参数。

print = lambda *tup : logger.info(str(" ".join([str(x) for x in tup]))) 


文章来源: Redirect Python 'print' output to Logger