Python logger - несколько экземпляров logger с несколькими уровнями - лучшие практики - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть следующие требования:

  1. Чтобы иметь один глобальный регистратор, который вы можете настроить (уровень установки, дополнительные обработчики, ..)
  2. Чтобы иметь на модуле регистратор, который вы можете можно настроить (уровень установки, дополнительные обработчики, ..)

Другими словами, нам нужно больше журналов с другой конфигурацией

Поэтому я сделал следующее

  1. создать метод для настройки регистратора:
def setup_logger(module_name=None, level=logging.INFO, add_stdout_logger=True):

   print("Clear all loggers")
   for _handler in logging.root.handlers:
       logging.root.removeHandler(_handler)

   if add_stdout_logger:
       print("Add stdout logger")
       stdout_handler = logging.StreamHandler(sys.stdout)
       stdout_handler.setLevel(level)
       stdout_handler.setFormatter(logging.Formatter(fmt='%(asctime)-11s [%(levelname)s] [%(name)s] %(message)s'))
       logging.root.addHandler(stdout_handler)


   print("Set root level log")
   logging.root.setLevel(level)

   if module_name:
       return logging.getLogger(module_name)
   else:
       return logging.getLogger('global')

Затем я создаю регистратор следующим образом:

logger_global = setup_logger(level=logging.DEBUG)
logger_module_1 = setup_logger(module_name='module1', level=logging.INFO)
logger_module_2 = setup_logger(module_name='module2', level=logging.DEBUG)

logger_global.debug("This is global log and will be visible because it is setup to DEBUG log")

logger_module_1.debug("This is logger_module_1 log and will NOT be visible because it is setup to INFO log") 

logger_module_2.debug("This is logger_module_2 log and will be visible because it is setup to DEBUG log")

Прежде чем я попробую, что работает, а что нет, и проверию его более глубоко, я хотите спросить вас, является ли это хорошей практикой для этого или у вас есть какие-либо другие рекомендации по выполнению наших требований?

Спасибо за помощь

1 Ответ

0 голосов
/ 27 апреля 2020

Наконец я нашел, как это сделать:

def setup_logger(module_name=None, level=logging.INFO, add_stdout_logger=True):

   custom_logger = logging.getLogger('global')
   if module_name:
       custom_logger = logging.getLogger(module_name)     

   print("Clear all handlers in logger") # prevent multiple handler creation
   module_logger.handlers.clear()

   if add_stdout_logger:
       print("Add stdout logger")
       stdout_handler = logging.StreamHandler(sys.stdout)
       stdout_handler.setLevel(level)
       stdout_handler.setFormatter(logging.Formatter(fmt='%(asctime)-11s [%(levelname)s] [%(name)s] %(message)s'))
       module_logger.addHandler(stdout_handler)

    # here you can add another handlers ,...

    # because we use custom handlers which have the different type of log level,
    # then our logger has to have the lowest level of logging
    custom_logger.setLevel(logging.DEBUG)

   return custom_logger 

Затем просто позвоните по следующему номеру

logger_module_1 = setup_logger(module_name='module1', level=logging.INFO)
logger_module_2 = setup_logger(module_name='module2', level=logging.DEBUG)

logger_module_1.debug("This is logger_module_1 log and will NOT be visible because it is setup to INFO log") 

logger_module_2.debug("This is logger_module_2 log and will be visible because it is setup to DEBUG log")
...