微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

父子记录器python的动态

如何解决父子记录器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.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?