首页 文章

为什么Python的日志包会忽略某些级别?

提问于
浏览
0

Exposition:

使用3.6.3 Python中的日志记录模块存在一些被误解的问题 . 首先,我使用标准配置创建2个日志,没有名称和级别= 30,这是logging.WARNING .

正如文档所说,日志对象没有处理程序,我将日志级别更改为10(logging.DEBUG),当我记录日志时,最后,日志没有任何处理程序,但https://docs.python.org/3/library/logging.html?highlight=logging#module-logging的文档说:

logging.basicConfig(** kwargs)¶:通过使用默认Formatter创建StreamHandler并将其添加到根 Logger 来为日志记录系统进行基本配置 . 如果没有为根 Logger 定义处理程序,函数debug(),info(),warning(),error()和critical()将自动调用basicConfig() .

所以,我的问题是,我做错了什么?这是为什么造成的?我不能实例化日志,将Root的级别设置为log.setLevel(logging.INFO),并像我一样做log.info(“poo”)直到这个问题?

Code:

Python 3.6.3 (default, Oct 31 2017, 11:19:55)                       
Type 'copyright', 'credits' or 'license' for more information       
IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help. 

In [1]: import logging                                              

In [2]: log1 = logging.getLogger()                                  

In [3]: log2 = logging.getLogger()                                  

In [4]: log1.level                                                  
Out[4]: 30                                                          

In [5]: log1.hasHandlers()                                          
Out[5]: False                                                       

In [6]: log1.setLevel(10) ## logging.DEBUG == 10                    

In [7]: log1                                                        
Out[7]: <RootLogger root (DEBUG)>                                   

In [8]: log2                                                        
Out[8]: <RootLogger root (DEBUG)>                                   

In [9]: log1.info("asdad")                                          

In [10]: log2.info("asdad")                                         

In [11]: log1.hasHandlers()                                         
Out[11]: False                                                      

In [12]: logging.basicConfig(level=20) # logging.INFO == 20         

In [13]: log2                                                       
Out[13]: <RootLogger root (INFO)>                                   

In [14]: log2.info("ASDADA")                                        
INFO:root:ASDADA                                                    

In [15]: log1.hasHandlers()                                         
Out[15]: True                                                       

In [16]: log1.handlers == log2.handlers                             
Out[16]: True                                                       

In [17]: logging.basicConfig(level=10) # logging.DEBUG == 10        

In [18]: log2.info("ASDADA")                                        
INFO:root:ASDADA                                                    

In [19]: log1                                                       
Out[19]: <RootLogger root (INFO)>                                   

In [20]: log2                                                       
Out[20]: <RootLogger root (INFO)>                                   

In [21]: log1.level                                                 
Out[21]: 20

UPDATED:1

In [1]: import logging

In [2]: logging.getLogger().hasHandlers()
Out[2]: False

In [3]: logging.getLogger().level
Out[3]: 30

In [4]: logging.getLogger().info("papa")

In [5]: logging.getLogger().hasHandlers()
Out[5]: False

In [6]: logging.info("foo")

In [7]: logging.getLogger().hasHandlers()
Out[7]: True

UPDATED:2

In [2]: import logging

In [3]: log = logging.getLogger()

In [4]: log.info("poo")

In [5]: log.warning("poo")
poo

In [6]: log.setLevel(logging.INFO)

In [7]: log.info("poo")

1 回答

  • 1

    我认为引用的文件不够明确 . 当您单击文档网页上列出的功能时,它们会链接到 logging.info() 等功能 . 您正在使用具有相同名称的 Logger 对象方法 .

    >>> import logging
    >>> logging.getLogger().hasHandlers()
    False
    >>> logging.warning("TEST")
    WARNING:root:TEST
    >>> logging.getLogger().hasHandlers()
    True
    

相关问题