在使用 peewee 框架时,默认是不会出现日志消息的。
from
peewee
import
Model
,
CharField
,
DateTimeField
,
IntegerField
from
peewee_mssql
import
MssqlDatabase
db
=
MssqlDatabase
(
database
=
'test'
,
host
=
'.'
,
user
=
'sa'
,
password
=
'sa'
)
class
BaseModel
(
Model
)
:
class
Meta
:
database
=
db
class
Person
(
BaseModel
)
:
Name
=
CharField
(
verbose_name
=
'姓名'
,
max_length
=
20
)
Age
=
IntegerField
(
verbose_name
=
'年龄'
)
Birthday
=
DateTimeField
(
verbose_name
=
'生日'
,
null
=
True
)
p
=
Person
(
Name
=
'张三'
,
Age
=
'20'
,
Birthday
=
'2018-01-01'
)
p
.
save
(
)
我们在上面代码中加上一个日志的定义:
import
logging
logger
=
logging
.
getLogger
(
'peewee'
)
logger
.
setLevel
(
logging
.
DEBUG
)
logger
.
addHandler
(
logging
.
StreamHandler
(
)
)
神奇的现象出现了,运行程序打出了一行日志:
我们虽然定义了日志,但是并没有写任何的日志,那么这一行日志是哪里来的呢?
查看
peewee
的源码,发现其中有日志的定义:
关于
logging.NullHandler
,网上大多数的解释就一句话:
该 Handler 实例会忽略 error messages,通常被想使用
logging
的 library 开发者使用来避免’No handlers could be found for logger XXX’信息的出现。
乍看没明白,仔细一想就明白了,其实很简单。
logging.getLogger(name)
方法是使用工厂方法返回一个
logger
实例,如果名为
name
的
logger
已存在,则直接将其返回。
在
peewee
中,定义了一个名为
'peewee'
的
logger
,但是只给了一个
NullHandler
,我们在代码中,
logger = logging.getLogger('peewee')
,这句实则就是获取了 peewee 中定义的 logger,并给它添加了一个
StreamHandler
,那自然就可以输出日志了。不信?给自己代码中的
logger
改个名字,看看还有日志输出不。
我们在写 library 的时候,也可以这样定义一个
NullHandler
,具体的实现就交给调用的人去决定吧。