python - два объекта логгера с разными уровнями и выходными потоками - PullRequest
0 голосов
/ 08 октября 2019

Язык программирования: Python 3.7

Я хотел бы настроить два объекта регистратора Python: один выводится в файл, а другой на sys.stdout.

Вот мой код:

def get_custom_logger(name: str, debug: bool, fname: str = None) -> logging.Logger:
     level = logging.DEBUG if debug else logging.INFO
     if fname is not None:
        logging.basicConfig(filename=fname, filemode='a+', level=level)
    else:
        logging.basicConfig(level=level, stream=sys.stdout)
    return logging.getLogger(name=name)

def main():
    tlog_info = get_custom_logger(name='Test_Info_Stdout', debug=False)
    tlog_info.info('INFO message')
    tlog_info.debug('DEBUG message - will be recorded iff debug = True')
    print(tlog_info)
    #
    tlog_dbg = get_custom_logger(name='Test_Debug_FileStream', debug=True, fname='test.out')
    tlog_dbg.info('INFO message')
    tlog_dbg.debug('DEBUG message - will be recorded iff debug = True')
    print(tlog_dbg)

if __name__ == '__main__':
    main()

Это не работает. Он либо

  • печатает все сообщения журнала на консоли независимо от уровня (если экземпляр tlog_info создан 1-й), или
  • выводит все протоколирует сообщения на test.out, независимо от уровня (если 1 * создается экземпляр tlog_debug)

Я пытался использовать аргумент handlers для basicConfig:

    loghandler = logging.StreamHandler(sys.stdout) if fname is None else logging.FileHandler(fname, mode='a+')
    logging.basicConfig(level=level, stream=sys.stdout, handlers=[loghandler])

но я получаю тот же результат.

Что дает?

И есть ли более чистый, более pythonic способ сделатьthis?

Обратите внимание, что я хочу вызвать get_custom_logger из различных функций / классов большего кода;некоторые регистраторы будут записывать в файл, другие на консоль.

Ответы [ 2 ]

2 голосов
/ 08 октября 2019

Вам следует позвонить basicConfig только один раз. Отметьте этот комментарий.

В качестве альтернативы вы можете сделать что-то вроде этого:

def get_custom_logger(name, debug, fname= None):
    level = logging.DEBUG if debug else logging.INFO

    logger = logging.getLogger(name=name)

    if fname is not None:
        handler = logging.FileHandler(fname)
    else:
        handler = logging.StreamHandler(sys.stdout)

    logger.setLevel(level)
    handler.setLevel(level)
    logger.addHandler(handler)

    return logger
0 голосов
/ 08 октября 2019

Одним из способов является создание корневого регистратора и добавление двух регистраторов поверх него. Здесь у вас есть более подробное объяснение, как это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...