Перенаправить STDOUT и STDERR на python регистратор, а также на ноутбук Jupyter - PullRequest
0 голосов
/ 18 февраля 2020

Важно знать: я работаю над ноутбуком Jupyter.

Я хочу создать регистратор, к которому я буду перенаправлять STDOUT и STDERR, но я также хочу видеть эти выходные данные на консоль вывода ноутбука Jupyter.

Пока что я реализовал:

import logging
import sys

class StreamToLogger(object):
    """
    Fake file-like stream object that redirects writes to a logger instance.
    """
    def __init__(self, logger, log_level=logging.INFO):
        self.logger = logger
        self.log_level = log_level
        self.linebuf = ''

    def write(self, buf):
        for line in buf.rstrip().splitlines():
            self.logger.log(self.log_level, line.rstrip())

    def flush(self):
        pass

logging.basicConfig(filename='my_log.log',
                    filemode='a',
                    # stream=sys.stdout,
                    level=logging.DEBUG,
                    format='%(asctime)s;%(name)s;%(levelname)s;%(message)s')

# redirect stdout and stderr to logger
stdout_logger = logging.getLogger('STDOUT')
sl = StreamToLogger(stdout_logger, logging.INFO)
sys.stdout = sl

stderr_logger = logging.getLogger('STDERR')
s2 = StreamToLogger(stderr_logger, logging.ERROR)
sys.stderr = s2

log = logging.getLogger('my_log')

# An info log
log.info('This is an info')

# A stdout message
print("This is an STDOUT")

# A stderr message
1 / 0

Первый вопрос: Предыдущий код, если он хранится в . Файл py , может перенаправить stdout и stderr в файл my_log.log . Но я теряю сообщения в обычной терминальной консоли.

Мне бы хотелось, чтобы и stderr , и stdout были перенаправлены в файл журнала, а также чтобы их можно было видеть на консоли.

Второй вопрос: Я работаю над ноутбуками Jupyter, и я хотел бы иметь возможность войти оттуда. Это означает, что все stdout и stderr перенаправляются из вывода ноутбука jupyter в файл журнала, но также сохраняются на консоли ноутбука jupyter. Я понял, что приведенный выше код перенаправляет stdout в файл журнала, но не в stderr, и в результате все мои отпечатки ('XX') находятся в моем файле журнала, а мои исключения все еще находятся на консоли ноутбука.

Похоже, что ноутбуки jupyter работают по-разному с STDOUT и STDERR

**enter image description here**

Спасибо за вашу помощь

...