2016-12-19 3 views
1

Покушение [see it running here]: Python каротаж на стандартный вывод и StringIO

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

Ожидаемый результат [стандартный вывод]:

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

ответ

0

Два все происходит здесь.

Во-первых, корневой регистратор создается с уровнем ПРЕДУПРЕЖДЕНИЯ, что означает, что никакие сообщения с уровнем ниже WARNING не будут обработаны. Вы можете установить уровень с помощью Logger.setLevel(level), где уровни определены здесь - https://docs.python.org/2/library/logging.html#levels.

Как указывается в комментарии, уровень журнала также можно установить с помощью:

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

Спасибо, прекрасно. Может быть упрощено с помощью 'level = 'INFO'' в' basicConfig' и 'console.stream.getvalue()', а не '.seek (0)', за которым следует '.read()'. –

+0

Спасибо, я уточню ответ с дополнительной информацией. –

Смежные вопросы