python logging之初步实践(二)

logger的层次结构

当前目录如下:

main.py
init.py
event
  |_   __init__.py
  |_  run.pyc

每个py文件头部添加代码

logger = logging.getLogger(__name__)
print(logger)

经过调试得出

main.py
init.py
event
  |_   __init__.py
  |_  run.py
 
  main.py的 logger 名为 __main__,  父级logger为 root
  init.py的 logger 名为 init,   父级logger为 root
 
  __init__.py 由于__init__.py 是一个特殊的 Python 文件,它用于将一个目录标记为 Python 的包。
          其对应的logger 名为 包名 event, 父级logger为 root
   run.py 的 logger 名为 event.run,父级目录为event.
 
logger层级为
root ---- __main__
  |__init
  |__event
    |___event.run
 
在__init__.py 获得的logger为目录层级。

 logger配置

属性

调试可以看到,logger的属性。

主要有 filters, handlers, level, propagate这些属性。

 

一个handler主要有filters, formatter, level这些属性 。

 设置

由层级结构,可知,最顶层的logger为root。

设置了root之后,所有的子logger生成的日志信息logger record,最后都会传递给root,由root的handlers进行处理。(前提是设置propagate属性为True)

logger输出的处理流程如下:

1.找到最上层的logger处理。

2.判断记录级别是否可输出。

3.根据logger对应的handlers进行处理。(若没有handlers,默认info级别输出到stderr)

设置示例:

默认的root,是没有handler等处理配置信息,但是看到level为waring.

这是因为无配置情况下,默认的Handler是存放在logging.lastResort属性中, 我们可以访问一下:

In [17]: logging.lastResort
Out[17]: <_StderrHandler <stderr> (WARNING)>

 1.设置root的基础配置。

# 输出格式设置
LOG_FORMAT = '[\033[32m%(levelname)s/%(module)s:(%(lineno)d)  %(asctime)s ]\033[0m  %(message)s'
LOG_FORMAT_DATE = '%Y-%m-%d %H:%M:%S'
# handler设置
default_handler = logging.StreamHandler()
default_handler.setLevel(logging.INFO)
default_handler.addFilter(MyFilter())

# root logger配置
    logging.basicConfig(level=logging.INFO,
                        format=LOG_FORMAT,
                        datefmt=LOG_FORMAT_DATE,
                        handlers=[default_handler])

此时,root可以格式化处理输出info及以上等级的日志。

 

2. 在模块 init.py中写入如下代码

 1 init.py
 2 
 3  import logging
 4  logger = logging.getLogger(__name__)
 5  
 6  logger.info("root handlers output")
 7  logger.setLevel(logging.DEBUG)
 8  logger.debug('debug')
 9  logger.propagate = False
10  logger.debug('debug') 
11  logger.warning('warn') 
12  handler = logging.StreamHandler()
13  handler.setLevel(logging.DEBUG)
14  logger.addHandler(handler)
15  logger.debug('debug')
16  

输出为: [INFO/init:(46) 2024-09-18 10:34:26 ] root handlers output
 warn
debug

line 6,因为logger init 继承logger root.可以输出info信息,且使用root的格式化形式。

line 8,尽管设置logger init 等级为debug,但是消息还是会传递给 root进行处理,因此logger.debug('debug')并没有输出

line 10, 设置了不向上传播,但是仍然不输出,是因为没有配置logger init 的handlers

line 11,    logger init 的处理器默认也是logging.lastResort,因此可以输出 warning级别以上信息到 stderr

line15,因为设置了logger init 的处理器,可以输出debug信息,因此输出。

 

posted @ 2024-09-18 11:20  zzl14  阅读(29)  评论(0)    收藏  举报