[英]Making Python loggers output all messages to stdout in addition to log file
[英]Making Python loggers log all stdout and stderr messages
使用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”包的优点(时间戳,...)?
实现您要求的正确方法是使用Logger对象。 它为您提供了更多的灵活性。 该对象可以绑定到多个处理程序。 您需要一个流处理程序以将消息记录到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
流对象。 创建一个类并对其进行自定义( 此处为原始答案 ):
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
我做了这个包裹来照你说的做。
pip install stdlogging
从pip安装后,您可以通过记录捕获任何输出。 但是请小心捕获stdout,因为它非常脆弱。
import stdlogging
stdlogging.enable(stdout=False, stderror=True)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.