0
библиотека Я использую принимает функцию так:Контекст менеджер по регистрации, эквивалентной contextmanager => выход на стандартный вывод
@contextlib.contextmanager
def stdout_cm():
yield sys.stdout
Теперь вместо foo(stdout_cm)
, как я могу отправить через logging
, например, что tee
s в несколько обработчиков? (Стандартный вывод и StringIO)
Попытка:
from sys import stdout, stderr
from cStringIO import StringIO
from logging import getLogger, basicConfig, StreamHandler
from subprocess import check_call
basicConfig(format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
datefmt='%m-%d %H:%M', level='INFO')
log = getLogger(__name__)
console = StreamHandler(StringIO())
log.addHandler(console)
log.addHandler(StreamHandler(stdout))
class LoggerContext(object):
def __init__(self, logger, level=None, close=True):
self.logger = logger
self.level = level
self.close = close
def __call__(self):
return self
def __enter__(self):
if self.level is not None:
self.old_level = self.logger.level
self.logger.setLevel(self.level)
def __exit__(self, et, ev, tb):
if not self.close:
return
for handler in self.logger.handlers:
handler.close()
Упрощенная функция:
def foo(f):
with f() as fh:
check_call(["printf '\n\n' | wc -l"], shell=True, stderr=fh, stdout=fh)
foo(LoggerContext(log)) #, level='WARN')
print console.stream.getvalue()
Хмм - http://stackoverflow.com/a/4838875 –