【问题标题】:Python logging to stdout and StringIOPython 记录到 stdout 和 StringIO
【发布时间】:2017-05-04 01:41:51
【问题描述】:

尝试 [see it running here]:

from sys import stdout, stderr
from cStringIO import StringIO
from logging import getLogger, basicConfig, StreamHandler

basicConfig(format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
            datefmt='%m-%d %H:%M')

log = getLogger(__name__)
sio = StringIO()
console = StreamHandler(sio)

log.addHandler(console)
log.addHandler(StreamHandler(stdout))

log.info('Jackdaws love my big sphinx of quartz.')
print 'console.stream.read() = {!r}'.format(console.stream.read())

输出[标准输出]:

console.stream.read() = ''

预期输出 [stdout]:

[date] [filename] INFO Jackdaws love my big sphinx of quartz.
console.stream.read() = 'Jackdaws love my big sphinx of quartz.'

【问题讨论】:

    标签: python python-2.7 logging stdout stringio


    【解决方案1】:

    这里发生了两件事。

    首先,root logger 实例化为 WARNING 级别,这意味着不会处理级别低于 WARNING 的消息。您可以使用Logger.setLevel(level) 设置级别,此处定义级别 - https://docs.python.org/2/library/logging.html#levels

    按照 cmets 的建议,日志级别也可以设置为:

    basicConfig(level='INFO', ...)
    

    其次,写入StringIO对象时,流中的位置设置在当前流的末尾。您需要倒回 StringIO 对象,然后才能从中读取。

    console.stream.seek(0)
    console.stream.read()
    

    更简单,只需调用:

    console.stream.getvalue()
    

    完整代码:

    from sys import stdout, stderr
    from cStringIO import StringIO
    from logging import getLogger, basicConfig, StreamHandler
    
    basicConfig(format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                datefmt='%m-%d %H:%M')
    
    log = getLogger(__name__)
    log.setLevel("INFO")
    sio = StringIO()
    console = StreamHandler(sio)
    
    log.addHandler(console)
    log.addHandler(StreamHandler(stdout))
    
    log.info('Jackdaws love my big sphinx of quartz.')
    console.stream.seek(0)
    print 'console.stream.read() = {!r}'.format(console.stream.read())
    

    【讨论】:

    • 谢谢,完美。可以通过basicConfigconsole.stream.getvalue() 中的level='INFO' 来简化,而不是.seek(0) 后跟.read()
    • 谢谢,我会用这个额外的信息更新答案。
    猜你喜欢
    • 1970-01-01
    • 2023-04-11
    • 2013-06-09
    • 2018-04-29
    • 1970-01-01
    • 2014-07-14
    • 2018-08-20
    • 2020-12-10
    • 1970-01-01
    相关资源
    最近更新 更多