Python 记录器 - 具有多个级别的多个记录器实例 - 最佳实践

Python logger - multiple logger instances with multiple levels - best practice

我有以下要求:

  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")

在我尝试哪些有效,哪些无效并进行更深入的测试之前,我想问你这样做是否是一个好的做法,或者你对如何实现我们的要求有任何其他建议吗?

感谢帮助

终于我找到了怎么做:

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")