Язык программирования: 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
из различных функций / классов большего кода;некоторые регистраторы будут записывать в файл, другие на консоль.