【发布时间】:2017-05-04 02:59:07
【问题描述】:
我正在使用的库采用如下函数:
@contextlib.contextmanager
def stdout_cm():
yield sys.stdout
现在我如何通过logging 实例而不是foo(stdout_cm) 将tees 发送到多个处理程序? (标准输出和 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()
【问题讨论】:
标签: python logging subprocess contextmanager stringio