代码之家  ›  专栏  ›  技术社区  ›  DragonBobZ

将日志级别设置为logging.debug或logging.info无效

  •  1
  • DragonBobZ  · 技术社区  · 5 年前

    我正在尝试进行一个非常简单的日志记录设置。我只希望所有日志输出都转到终端和日志文件。我在上找到了下面的示例 Real Python 它演示流和文件日志处理程序的设置:

    # logging_example.py
    
    import logging
    
    # Create a custom logger
    logger = logging.getLogger(__name__)
    
    # Create handlers
    c_handler = logging.StreamHandler()
    f_handler = logging.FileHandler('file.log')
    c_handler.setLevel(logging.WARNING)
    f_handler.setLevel(logging.ERROR)
    
    # Create formatters and add it to handlers
    c_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
    f_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    c_handler.setFormatter(c_format)
    f_handler.setFormatter(f_format)
    
    # Add handlers to the logger
    logger.addHandler(c_handler)
    logger.addHandler(f_handler)
    
    logger.warning('This is a warning')
    logger.error('This is an error')
    
    ## Log Output
    # 2019-08-31 22:16:02,478 - __main__ - WARNING - This is a warning
    # 2019-08-31 22:16:02,478 - __main__ - ERROR - This is an error
    

    这会像您所期望的那样记录到控制台和文件中。但是,当我修改程序时,它也会记录信息,比如:

    import logging
    
    # Create a custom logger
    logger = logging.getLogger(__name__)
    
    # Create handlers
    c_handler = logging.StreamHandler()
    f_handler = logging.FileHandler('file.log')
    c_handler.setLevel(logging.DEBUG)
    f_handler.setLevel(logging.DEBUG)
    
    # Create formatters and add it to handlers
    c_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
    f_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    c_handler.setFormatter(c_format)
    f_handler.setFormatter(f_format)
    
    # Add handlers to the logger
    logger.addHandler(c_handler)
    logger.addHandler(f_handler)
    
    
    logger.warning('logs')
    logger.error('logs')
    logger.info('should log but doesn\'t')
    logger.debug('should log but doesn\'t')
    
    ## Log Output
    # __main__ - WARNING - logs
    # __main__ - ERROR - logs
    

    我做错什么了?任何帮助都将不胜感激!

    2 回复  |  直到 5 年前
        1
  •  1
  •   Marius Mucenicu    5 年前

    您还需要调用 setLevel(level) logger 对象本身,因为默认情况下,它将使用 ROOT 的日志级别(如果它没有任何其他祖先),即 WARNING :

    logger.setLevel(logging.DEBUG)
    

    带输出的完整代码:

    import logging
    
    logger = logging.getLogger(__name__)
    
    # Create handlers
    c_handler = logging.StreamHandler()
    f_handler = logging.FileHandler('file.log')
    logger.setLevel(logging.DEBUG) # <<< Added Line
    c_handler.setLevel(logging.DEBUG)
    f_handler.setLevel(logging.INFO)
    
    # Create formatters and add it to handlers
    c_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
    f_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    c_handler.setFormatter(c_format)
    f_handler.setFormatter(f_format)
    
    # Add handlers to the logger
    logger.addHandler(c_handler)
    logger.addHandler(f_handler)
    
    
    logger.warning('logs')
    logger.error('logs')
    logger.info('should log but doesn\'t')
    logger.debug('should log but doesn\'t')
    

    输出:

    __main__ - WARNING - logs
    __main__ - ERROR - logs
    __main__ - INFO - should log but doesn't
    __main__ - DEBUG - should log but doesn't
    
        2
  •  1
  •   logan    5 年前

    有两个地方可以设置级别: Logger , Handler . 这两者都将影响日志记录设置的输出——在日志记录流的不同节点中。你也可以添加 Fliter 对这两个 实例以使用更复杂的规则筛选日志记录。

    流动的炭 office docment 明确日志记录时发生的情况。