我想将所有中间日志消息(警告,信息,错误)存储到python中的字符串,最后在程序结束时,将所有内容显示为控制台的报告。
我试图按照http://opensourcehacker.com/2011/02/23/temporarily-capturing-python-logging-output-to-a-string-buffer/中列出的步骤但是没有成功。
有人能告诉我一个简短,干净的方法吗?
这就是我现在尝试过的:
log = logging.getLogger('basic_logger')
log.setLevel(logging.DEBUG)
report=""
memory_handler=logging.handlers.MemoryHandler(1024*20,logging.ERROR,report)
memory_handler.setLevel(logging.DEBUG)
log.addHandler(memory_handler)
log.info("hello world")
memory_handler.flush()
print "report:",report
它可以像记录到StringIO
对象一样简单:
import logging
try:
from cStringIO import StringIO # Python 2
except ImportError:
from io import StringIO
log_stream = StringIO()
logging.basicConfig(stream=log_stream, level=logging.INFO)
logging.info('hello world')
logging.warning('be careful!')
logging.debug("you won't see this")
logging.error('you will see this')
logging.critical('critical is logged too!')
print(log_stream.getvalue())
产量
INFO:root:hello world WARNING:root:be careful! ERROR:root:you will see this CRITICAL:root:critical is logged too!
如果您只想在WARN,INFO和ERROR级别记录这些消息,则可以使用过滤器进行记录。下面的LevelFilter
检查每个日志记录的级别no,仅允许所需级别的记录:
import logging
try:
from cStringIO import StringIO # Python 2
except ImportError:
from io import StringIO
class LevelFilter(logging.Filter):
def __init__(self, levels):
self.levels = levels
def filter(self, record):
return record.levelno in self.levels
log_stream = StringIO()
logging.basicConfig(stream=log_stream, level=logging.NOTSET)
logging.getLogger().addFilter(LevelFilter((logging.INFO, logging.WARNING, logging.ERROR)))
logging.info('hello world')
logging.warning('be careful!')
logging.debug("you won't see this")
logging.error('you will see this')
logging.critical('critical is no longer logged!')
print(log_stream.getvalue())
产量
INFO:root:hello world WARNING:root:be careful! ERROR:root:you will see this
您也可以编写自己的流类。正如https://docs.python.org/2/library/logging.handlers.html所说,只有write
and和flush
are用于流媒体。
例:
import logging
class LogStream(object):
def __init__(self):
self.logs = ''
def write(self, str):
self.logs += str
def flush(self):
pass
def __str__(self):
return self.logs
log_stream = LogStream()
logging.basicConfig(stream=log_stream, level=logging.DEBUG)
log = logging.getLogger('test')
log.debug('debugging something')
log.info('informing user')
print(log_stream)
输出:
DEBUG:test:debugging something
INFO:test:informing user
也许这个示例代码就足够了。 通常,您应该发布您的代码,以便我们可以看到正在发生的事情。 在遵循任何给定的教程时,您还应该查看日志记录模块的实际Python文档。 https://docs.python.org/2/library/logging.html
标准Python日志记录模块可以记录到文件。完成日志记录后,可以将该文件的内容打印到shell输出中。
# Do some logging to a file
fname = 'mylog.log'
logging.basicConfig(filename=fname, level=logging.INFO)
logging.info('Started')
logging.info('Finished')
# Print the output
with open(fname, 'r') as f:
print f.read() # You could also store f.read() to a string