Важно знать: я работаю над ноутбуком 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
Спасибо за вашу помощь