Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python记录器-具有多个级别的多个记录器实例-最佳实践_Python_Logging_Handler - Fatal编程技术网

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

Python记录器-具有多个级别的多个记录器实例-最佳实践,python,logging,handler,Python,Logging,Handler,我有以下要求: 拥有一个可配置的全局记录器(设置级别、其他处理程序等) 要具有可配置的每个模块记录器(设置级别、附加处理程序等) 换句话说,我们需要更多配置不同的日志 因此,我做了以下几点 logger_module_1 = setup_logger(module_name='module1', level=logging.INFO) logger_module_2 = setup_logger(module_name='module2', level=logging.DEBUG) logge

我有以下要求:

  • 拥有一个可配置的全局记录器(设置级别、其他处理程序等)
  • 要具有可配置的每个模块记录器(设置级别、附加处理程序等)
  • 换句话说,我们需要更多配置不同的日志

    因此,我做了以下几点

    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")
    
  • 创建用于设置记录器的方法:
  • 然后,我创建记录器,如下所示:

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

    这会在每次调用根时向其添加另一个处理程序。不要那样做,一次就够了。也不要一直设置根记录器级别。