Python:logging.NullHandler 的使用

在使用 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 實例,如果名爲 namelogger 已存在,則直接將其返回。

peewee 中,定義了一個名爲'peewee'logger,但是隻給了一個 NullHandler,我們在代碼中,logger = logging.getLogger('peewee'),這句實則就是獲取了 peewee 中定義的 logger,並給它添加了一個 StreamHandler,那自然就可以輸出日誌了。不信?給自己代碼中的 logger 改個名字,看看還有日誌輸出不。

我們在寫 library 的時候,也可以這樣定義一個 NullHandler,具體的實現就交給調用的人去決定吧。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章