我创建了一个带有StreamHandler的定制Python,最初设置为logging.INFO级别。这正确地隐藏了DEBUG级别的日志并输出了INFO级别的日志。
我还创建了一个函数,将记录器和处理程序的级别更改为logging.DEBUG。打印出logger.getEffectiveLevel()和handler.level都表明它确实发生了变化。
然而,当我期望INFO级别的日志也出现时,我仍然只能获得DEBUG级别的日志。我遗漏了什么?查看了一堆具有类似问题的帖子,但所有这些帖子都试图使用根记录器进行日志记录,并且丢失或没有配置它们的处理程序,这里的情况并非如此。
Python版本3.8.6。
代码分为两部分:
logger = get_logger("my_logger") // Creates custom Python logger
async def main():
<...Other code...>
logger.debug("Before update")
logger.info("Before update")
print(f"{logger.name} - {logger.getEffectiveLevel()}")
for handler in logger.handlers:
print(f"{type(handler)} - {handler.level}")
<...Code that updates level for get_level() function...>
update_log_levels() // Function that changes logging level
print(f"{logger.name} - {logger.getEffectiveLevel()}")
for handler in logger.handlers:
print(f"{type(handler)} - {handler.level}")
logger.debug("After update")
logger.info("After update")
if __name__ == "__main__":
asyncio.run(main())class CustomLogger(logging.Logger):
def __init__(self, name: str, level: int):
super().__init__(name, level)
handler = logging.StreamHandler()
handler.setLevel(level)
handler.setFormatter(FORMATTER)
self.addHandler(handler)
loggers = {}
def get_logger(name: str):
level = get_level() // Function that gets level
if name not in loggers.keys():
loggers[name] = CustomLogger(name, level)
return loggers[name]
def update_log_levels():
for _, logger in loggers.items():
level = get_level() // Function that gets level
logger.setLevel(level)
for handler in logger.handlers:
handler.setLevel(level)我得到的输出:
2022-11-04 15:06:40,102 - my_logger - INFO - Before update
my_logger - 20
<class 'logging.StreamHandler'> - 20
my_logger - 10
<class 'logging.StreamHandler'> - 10
2022-11-04 15:06:40,102 - my_logger - INFO - After update发布于 2022-11-05 03:10:55
这是因为标准的logging模块不是为该模式设计的。Logger实例应该由logging.getLogger()创建。(参见参考文献。它写着“永不”。)
使用logging.setLoggerClass()注册CustomLogger并调用logging.getLogger()。
您可以像这样操作现有的记录器。
logger_names = set()
def get_logger(name):
logger_names.add(name)
return logging.getLogger(name)
def update_log_levels():
for name in logger_names:
logger = logging.getLogger(name)
...https://stackoverflow.com/questions/74323695
复制相似问题