将记录器消息存储在字符串中

新手上路,请多包涵

我想将所有中间日志消息(警告、信息、错误)存储到 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

原文由 trup 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 345
2 个回答

它可以像记录到 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())

输出

信息:根:你好世界
警告:root:小心!
错误:root:你会看到这个
CRITICAL:root:critical 也被记录了!

如果您只想记录 WARN、INFO 和 ERROR 级别的消息,您可以使用过滤器来完成。 LevelFilter 下面检查每个日志记录的级别否,只允许所需级别的那些记录:

 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())

输出

信息:根:你好世界
警告:root:小心!
错误:root:你会看到这个

原文由 mhawke 发布,翻译遵循 CC BY-SA 3.0 许可协议

请注意,涉及 basicConfig 的解决方案设置所有其他记录器继承自的 记录器的属性,这可能是不需要的,因为库也会记录到它。我的用例是一个调用数据处理模块的网站,我只想专门抓取那个模块的日志。这还具有允许登录到文件和终端的现有处理程序持续存在的优点:

 import io, logging
from django.http import HttpResponse

log_stream = io.StringIO()
log_handler = logging.StreamHandler(log_stream)
logging.getLogger('algorithm.user_output').addHandler(log_handler)

algorithm()
return HttpResponse(f'<pre>{log_stream.getvalue()}</pre>')

algorithm.py

 logger = logging.getLogger(__name__ + '.user_output')  # 'algorithm.user_output'

原文由 xjcl 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题