python中的logging

简介:

python logging模块可能会令人困惑的地方

通过参阅python logging模块的代码,发现一些有趣的现象:

 

1. logging对象其实是一个树形结构,每个创建的logging对象都是root logging对象的孩子结点。当使用logging模块的getLogger(name=None)函数构造logging对象的时候,如果name为None,这样会产生一个root logging对象。如果name中含有.,比如name = 'a.b.c',通过这种方式会产生3个logging对象,分别为c、b、a,c->b->a->root,root树的根结点,a为root的孩子结点,b为a的孩子结点,c为a的孩子结点,依次类推。

 

2. root结点是全局的,虽然这过程中涉及到多个模块,但是它们会共享一个root结点。

 

3. 每个logging对象打LOG的时候,也会把LOG信息传递到传递到上层logging对象中,对于c->b->a->root这种情况,这个LOG其实会打4次,以c、b、a、root循序依次打一个LOG。

 

可能有人会问,像我之前一般用A模块或者B模块那样的方式去初始化一个logging对象,这样初始化的对象也会是root logging对象的一个孩子,而root logging对象通常会把LOG打到屏幕上,那按理说,正常情况下打LOG都会打两份,一份会打到文件中,一份会打到屏幕中。那为什么实际情况是,只有LOG文件中有对应的LOG,但是屏幕中并没有对象的显示呢?

 

其实,如果对这个过程有些好奇,对直接很习以为常的方式有些怀疑,而且抱着这样的好奇心去探索,相信肯定会有更多的收获。

 

 

所以,比较困惑的是,为什么我调用A模块产生的sLogger.info打出的LOG,只有LOG文件中有,而root logging为什么不打LOG打到屏幕上。为什么root logging不起作用。这个时候,可以看下logging __init__.py的代码,会发现,root logging info的代码如下:

 

 

def info(msg, *args, **kwargs):

    """

    Log a message with severity 'INFO' on the root logger.

    """

    if len(root.handlers) == 0:

        basicConfig()

    root.info(msg, *args, **kwargs)

 

 上面的代码中涉及到root.handlers,怀疑root.handlers跟打LOG的方式有关。因此,print len(root.handlers),发现结果为0。也就是说,默认的root logging对应的handlers为[],这样导致的结果是sLogger打LOG的时候,root logging并不会打任何LOG。



Python中的logging模块

记录异常信息

当你使用logging模块记录异常信息时,不需要传入该异常对象,只要你直接调用logger.error() 或者 logger.exception()就可以将当前异常记录下来。

1
2
3
4
5
6
7
8
9
10
11
# 记录异常信息
try :
     1  /  0
except :
     # 等同于error级别,但是会额外记录当前抛出的异常堆栈信息
     logger.exception( 'this is an exception message' )
# 2016-10-08 21:59:19,493 ERROR   : this is an exception message
# Traceback (most recent call last):
#   File "D:/Git/py_labs/demo/use_logging.py", line 45, in <module>
#     1 / 0
# ZeroDivisionError: integer division or modulo by zero


      本文转自Tenderrain 51CTO博客,原文链接:http://blog.51cto.com/tenderrain/1878973 ,如需转载请自行联系原作者





相关文章
|
3月前
|
Python
python正确使用logging日志的方式
python正确使用logging日志的方式
32 0
|
3月前
|
开发者 Python
Python学习 -- logging模块
Python学习 -- logging模块
20 0
|
8月前
|
Python
python-- logging 模块
python-- logging 模块
|
6月前
|
开发者 Python
Python学习 -- logging模块
Python学习 -- logging模块
35 0
|
7月前
|
Python
Python logging模块怎么使用,你会了吗?
Python logging模块怎么使用,你会了吗?
148 0
|
8月前
|
编解码 运维 监控
Python日志logging实战教程
我们从一个简单的日志记录实战,一步一步实现了自定义日志格式、写日志文件、抽出公共日志模块让其他模块用、同时写多个日志文件并进行日志文件切割、通过配置文件实现日志参数的定义、解决日志中文显示问题。基本覆盖了真实应用场景日志的使用。
168 0
|
11月前
|
JSON 运维 监控
追踪问题——用Python Logging模块更轻松地诊断错误
追踪问题——用Python Logging模块更轻松地诊断错误
|
12月前
|
程序员 开发者 Python
【Python】如何使用Logging模块第3期
【Python】如何使用Logging模块第3期
|
12月前
|
Python
【Python】如何使用Logging模块第2期
【Python】如何使用Logging模块第2期

热门文章

最新文章