python中的root的几个表达_Python root logger 解密(第二节)

前言

为了控制文章的长度, 方便方便大家阅读, 本文将分节放出, 此为第二节.

本文主要讲解Python3logging模块中root logger的一些小知识. 在阅读本文之前希望读者了解logging模块的基本用法.

正文

3. 默认的Formater是在哪里设置的?

在默认情况下, 我们看到的log信息是这样的:

WARNING:root:this is warning

那么, 默认的Format是在哪里设置的呢?

In [17]: logging.BASIC_FORMAT

Out[17]: '%(levelname)s:%(name)s:%(message)s'

默认的Formatter保存在全局变量BASIC_FORMAT, 当我们不带任何参数实例化一个Formatter时, 这个参数就会被使用.

4. 默认的Filter是什么?

我们之前讲了Logger, Formatter以及Handler, 接下来将一下Filter.

Filter类似于Handler, 存放在列表中:

In [24]: logging.root.filters

Out[24]: []

可以看到默认的filters为空, 也就是说没有过滤任何record, 它的实现原理如下:

def filter(self, record):

rv = True

for f in self.filters:

if hasattr(f, 'filter'):

result = f.filter(record)

else:

result = f(record) # assume callable - will raise if not

if not result:

rv = False

break

return rv

filter函数会遍历所有的filters列表, 使用filter.filter(record)对其进行判定, 并返回bool值, 如果返回False, 那么这个record就会被拒绝. 当所有的filters都返回True, 那么这个record就会被接受.

5. propagate有什么作用?

从官方文档中提供的流程图可以看出, propagate会把当前的logger设置为其parent, 并将record传入parent的Handler, 这就会导致一个有趣的现象:

# 给root logger 添加一个Handler

In [42]: import sys

In [43]: logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)

In [44]: logging.root.handlers

Out[44]: [ (NOTSET)>]

# 新建一个child logger

In [5]: child = logging.getLogger('child')

In [6]: child.parent

Out[6]:

In [7]: child.handlers

Out[7]: []

# log 信息

In [8]: child.debug('this is a debug message')

DEBUG:child:this is a debug message

我们的child logger 是没有Handler的, 但是我们的record还是被发送到了终端, 这就是propagate的作用, 它把子代的所有record都发送给了父代, 循环往复, 最终到达root, 如果我们在子代中设置了hander, 那么一个record就会被发送两次:

In [9]: child.addHandler(logging.StreamHandler())

In [10]: child.debug('this message will be handled twice')

this message will be handled twice

DEBUG:child:this message will be handled twice

第一次是子代发送到stderr(默认), 第二次是使用root的handler.

所以在文档中提到:Child loggers propagate messages up to the handlers associated with their ancestor loggers. Because of this, it is unnecessary to define and configure handlers for all the loggers an application uses. It is sufficient to configure handlers for a top-level logger and create child loggers as needed.

我们没必要配置子代的Handler, 因为最终虽有的record都会被转发到root, 我们只需要配置它就可以了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值