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

Why Python's logging package ignores some levels?

展览:

使用3.6.3 python中的日志模块时,存在一些误解的问题。首先,我用标准配置创建两个日志,没有名称和级别=30,这就是logging.warning。

正如文档所说,日志对象不需要处理程序,我将日志级别更改为10(logging.debug),当我要打印日志时,信息(级别=20),首先,在级别10(低于信息级别)中,信息不记录,最后,日志没有任何处理程序,但是https://docs.python.org/3/library/logging.html的文档?highlight=logging模块日志记录显示:

logging.basicConfig(**kwargs)? :

Does basic configuration for the logging system by creating a
StreamHandler with a default Formatter and adding it to the root
logger. The functions debug(), info(), warning(), error() and
critical() will call basicConfig() automatically if no handlers are
defined for the root logger.

所以,我的问题是,我做错了什么?为什么会这样?我不能实例化日志,将根的级别设置为log.set level(logging.info),并将log.info("poo")设置为这个问题之前的操作吗?.

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
    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

更新时间:1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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

更新时间:2

1
2
3
4
5
6
7
8
9
10
11
12
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")

我认为引用的文件不够清楚。当您单击Docs网页上列出的函数时,它们会链接到logging.info()等函数。您使用的是具有相同名称的记录器对象方法。

1
2
3
4
5
6
7
>>> import logging
>>> logging.getLogger().hasHandlers()
False
>>> logging.warning("TEST")
WARNING:root:TEST
>>> logging.getLogger().hasHandlers()
True