父子记录器python的动态

问题描述

不幸的是,我没有正确理解 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 来执行(自编)模块文件中的代码 - 这会改变什么吗?

谁能给我解释一下?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...