使Python记录器记录所有stdout和stderr消息

时间:2017-11-16 09:05:40

标签: python logging stdout tee

使用python日志包,并编写一个类Log,我想将stdout和stderr发送到日志文件:

log = Log("log.txt")
print "line1"
print "line2"
print >>sys.stderr, "err1"
del log
print "line to screen only"

输出日志文件包含:

16/11/2017 09:51:58 INFO - line1
16/11/2017 09:51:58 INFO - line2
16/11/2017 09:51:58 INFO - err1

知道如何编写这个Log类,保留“logging”包的优点(时间戳,......)?

2 个答案:

答案 0 :(得分:0)

正确实现您所要求的方法是使用Logger对象。它为您提供了更多的灵活性。该对象可以绑定到多个处理程序;您需要一个streamhandler来将消息记录到sys.stdout和一个文件处理程序以将其记录到文件中。然后,您可以打印到屏幕并使用单个命令登录到文件。

import logging

# create logger 
logger = logging.getLogger('example')
logger.setLevel(logging.INFO)

# create file handler which logs messages
fh = logging.FileHandler('fh.log')
fh.setLevel(logging.DEBUG)

# create console handler to print to screen
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)

# create formatter and add it to the handlers
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)

# add the handlers to the logger
logger.addHandler(fh)
logger.addHandler(ch)

现在,对logger.info(msg)的每次调用都会打印到屏幕上,然后写入fh.log文件。

还有另一种方法,可以替换sys.stdoutsys.stderr流对象。创建一个类并对其进行自定义(original answer here):

import sys

class writer(object):
    _fh = None
    _orig_stdout = sys.stdout

   def __init__(self):
       _fh = open('logging.log', 'w')

    def write(self, data):
        fp.write(data)
        _orig_stdout.write(data)

    def flush():
        _orig_stdout.flush()

logger = writer()

sys.stdout = logger
sys.stderr = logger

答案 1 :(得分:0)

我做了this package来照你说的做。

pip install stdlogging

从pip安装后,您可以通过记录捕获任何输出。但是请小心捕获stdout,因为它非常脆弱。

import stdlogging
stdlogging.enable(stdout=False, stderror=True)