使用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”包的优点(时间戳,......)?
答案 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.stdout
和sys.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)