在文件1中:
def get_logger():
return logging.getLogger(_LOGGER_NAME)
def init_logger():
message_format = logging.Formatter(fmt='%(asctime)s %(name)s >>> %(message)s',
datefmt='%Y-%m-%d %H-%M-%S')
console_info_handler = logging.StreamHandler(sys.stdout)
console_info_handler.setLevel(logging.INFO)
console_info_handler.setFormatter(fmt=message_format)
logger = logging.getLogger(_LOGGER_NAME)
logger.addHandler(console_info_handler)
logger.setLevel(logging.INFO)
return logger
在文件2中:
if name == '__main__':
logger = get_logger()
logger.info(logger.level)
不打印任何内容(当然可以导入)。如果我去:
if __name__ == '__main__':
logger = get_logger()
logger.critical(logger.level)
输出为0,而不是预期的20。因此,看来记录器级别未设置为我认为的水平。而且,该级别比我想象的要低,但是它仍然没有登录logger.info。我在这里做错了什么?哦,还有一个额外的问题(因为我偷了上面的代码并且不知道python的任何日志记录复杂性),如果记录器的级别和处理程序的级别发生冲突,如何解决日志消息?
答案 0 :(得分:1)
文件2仅调用get_logger()
,而不调用init_logger()
。因此,永远不会在记录器上调用setLevel,因此给定了默认值NOTSET
。
看看:https://docs.python.org/3/library/logging.html#logging.Logger.setLevel
默认情况下,根记录器的创建级别为WARNING
。这就是为什么logger.info(logger.level)
不执行任何操作的原因,因为INFO
在WARNING
以下。另一方面,logger.critical(logger.level)
输出0,因为这是NOTSET
的数值。
要让它执行您想要的操作,只需在第二个文件中调用init_logger()
:
if __name__ == '__main__':
logger = init_logger()
logger.info(logger.level)
要回答您的奖励问题:处理程序会通过记录器获取任何消息。
如果记录器的级别为DEBUG
,并且处理程序的级别为INFO
,则处理程序将从DEBUG
级别开始接收所有消息,但仅输出INFO
级以上的邮件。
答案 1 :(得分:0)
您没有呼叫init_logger()
(在呼叫logger.info()
之前),因此未设置非默认_LOGGER_NAME
的级别。
还要注意拼写错误:if name == '__main__':
-> if __name__ == '__main__':