父子记录器python的动态

时间:2021-01-06 00:06:25

标签: python logging jupyter-notebook

不幸的是,我没有正确理解 Python 中子记录器和父记录器之间的交互。

我想要做的是我有两个记录器,一个记录程序中的 INFO 级别的检查点,另一个应该记录 WARNINGS 和更高级别。如果警告记录器出现错误,它也应该显示在 stdout 中。

首先我以为我将 root-logger 的级别设置为 ERROR,这样会自动只显示错误消息。

import logging
logging.basicConfig(level=logging.ERROR)

# Info logger with file handler
info_logger = logging.getLogger("info")
info_logger.setLevel(logging.INFO)

info_file_handler = logging.FileHandler('info.log')
info_logger.addHandler(info_file_handler)

# warning logger with file handler
warning_logger = logging.getLogger("warning")
warning_logger.setLevel(logging.WARNING)

warning_file_handler = logging.FileHandler('warning.log')
warning_logger.addHandler(warning_file_handler)

# logging events, message explaines if shown or not
warning_logger.info("NOT Printed")
warning_logger.error("YES")
info_logger.debug("Also NOT Printed")

这在一个文件(或一个 Jupyter Notebook)中工作正常。 但是当我添加更多模块后,突然每条消息都显示出来,没有被处理程序拦截。

### in module/main.py
import logging
logging.basicConfig(level=logging.ERROR)

import someothermodule

# Info logger with file handler
info_logger = logging.getLogger("info")
info_logger.setLevel(logging.INFO)
    
info_file_handler = logging.FileHandler('info.log')
info_logger.addHandler(info_file_handler)
    
# warning logger with file handler
warning_logger = logging.getLogger("warning")
warning_logger.setLevel(logging.WARNING)
    
warning_file_handler = logging.FileHandler('warning.log')
warning_logger.addHandler(warning_file_handler)

#doing some stuff than:
info_logger.info("NOW Printed")
warning_logger.debug("Still not printed")


### in module/someothermodule.py
import logging

# creating child logger for the module
INFO_LOGGER = logging.getLogger(f"info.{__name__}")
WARNING_LOGGER = logging.getLogger(f"warning.{__name__}")

# doing some stuff
WARNING_LOGGER.info("NOT Printed")
WARNING_LOGGER.error("Printed")
INFO_LOGGER.debug("Now Printed")

我首先想到是因为某个地方的 root-logger 已经被初始化,而且还在每个模块的前两行中添加:

import logging
logging.basicConfig(level=logging.ERROR)

没有帮助。

同样尝试通过 logging.basicConfig(handlers=[logging.NullHandler()]) 使 root-logger 静音也没有用,也没有尝试通过 logging.getLogger().setLevel(logging.DEBUG) 来强制 root-logger 的级别。

我解决了我的问题,将与 root-logger 相关的任何内容都删除并添加 a) 一个流处理程序到警告记录器并将其级别设置为 ERROR 和 b) 使用 info_logger.propagate = False 停止警告和信息处理程序的传播.
但我还是想知道为什么第一次尝试失败了...

也许我应该补充一点,我正在使用 Jupyter Notebooks 来执行(自编)模块文件中的代码 - 这会改变什么吗?

谁能给我解释一下?

0 个答案:

没有答案
相关问题