почему contextlib.redirect_stdout не перехватывает стандартный вывод из регистратора? - PullRequest
0 голосов
/ 08 мая 2019

Попытка сохранить журналы (распечатанные на консоль и сохраненные в файл с помощью регистратора) из функций в переменных для потоковой передачи их в веб-службу.

Python 3.4.7

from contextlib import redirect_stdout
import sys, io, logging

def log_config(logfile, mode):
    FileFormatter = logging.Formatter(
        "%(asctime)s [%(funcName)-12.12s] [%(levelname)-8.8s]  %(message)s")
    ConsoleFormatter = logging.Formatter("[%(asctime)s] : %(message)s")
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    consoleHandler = logging.StreamHandler(sys.stdout)
    consoleHandler.setFormatter(ConsoleFormatter)
    fileHandler = logging.FileHandler(logfile, mode='w')
    fileHandler.setFormatter(FileFormatter)
    if mode == 'console':
        logger.addHandler(consoleHandler)
    elif mode == 'file':
        logger.addHandler(fileHandler)
    elif mode == 'both':
        logger.addHandler(fileHandler)
        logger.addHandler(consoleHandler)
    return logger
step_comment_io = io.StringIO()
logger = log_config('test.log', 'both')
with redirect_stdout(step_comment_io):
    print ('printing')
    # would like the below line also to be in stdout
    logger.info('logging') 
step_comment_io.getvalue()

Ожидаемый результат:

печать \ nlogging \ п '

Фактический объем производства:

печать \ п '

...