日志级别异常:DEBUG与INFO级别的日志无法正常输出
问题原因及解决办法
1. Logger本身未设置日志级别
Python的logging模块中,Logger对象默认的日志级别是WARNING,只有级别≥WARNING的日志才会被传递给Handler处理。你只给两个Handler设置了级别,但Logger本身的级别没调整,导致DEBUG和INFO级别的日志直接被Logger过滤掉,根本到不了Handler环节。
解决办法:在创建Logger后,设置其级别为DEBUG(这样所有级别≥DEBUG的日志都会被放行到Handler):
self.logger = logging.getLogger(__name__) self.logger.setLevel(logging.DEBUG) # 新增这一行
2. 日志格式字符串存在语法错误
你的Formatter格式字符串里有个笔误:%(<levelname)s 应该是 %(levelname)s,多了个多余的<符号,这会导致日志格式化失败(不过这不是DEBUG/INFO不输出的直接原因,但会影响日志显示)。修正后的格式字符串:
log_format = logging.Formatter(fmt='%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
验证修改后的完整代码
# Create a custom logger self.logger = logging.getLogger(__name__) self.logger.setLevel(logging.DEBUG) # 新增Logger级别设置 # Create handlers self.handler_cmdline = logging.StreamHandler() self.handler_file = logging.FileHandler(self.logfile) self.handler_cmdline.setLevel(logging.DEBUG) self.handler_file.setLevel(logging.INFO) # Create formatters and add it to handlers log_format = logging.Formatter(fmt='%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S') self.handler_cmdline.setFormatter(log_format) self.handler_file.setFormatter(log_format) # Add handlers to the logger self.logger.addHandler(self.handler_cmdline) self.logger.addHandler(self.handler_file) self.logger.debug('Initialisation Complete') self.logger.info('Initialisation Complete') self.logger.warning('Initialisation Complete') self.logger.critical('Initialisation Complete')
修改后,控制台(StreamHandler)会输出所有级别≥DEBUG的日志,日志文件(FileHandler)会输出所有级别≥INFO的日志,符合预期。
内容的提问来源于stack exchange,提问作者smyril
相关产品推荐
相关产品推荐

