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
__init__.py 是一个特殊的 Python 文件,它用于将一个目录标记为 Python 的包。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信息,因此输出。

浙公网安备 33010602011771号