专栏首页学无止境Python:logging.NullHandler 的使用

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 实例,如果名为 name 的 logger 已存在,则直接将其返回。

在 peewee 中,定义了一个名为“peewee”的 logger,但是只给了一个 NullHandler,我们在代码中,logger = logging.getLogger('peewee'),这句实则就是获取了 peewee 中定义的 logger,并给它添加了一个 StreamHandler,那自然就可以输出日志了。不信?给自己代码中的 logger 改个名字,看看还有日志输出不。

我们在写 library 的时候,也可以这样定义一个 NullHandler,具体的实现就交给调用的人去决定吧。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python:用 peewee 框架连接 SQL Server

      Peewee 默认支持 Sqlite、MySQL、PostgreSQL 三种数据库,如果要使用其他数据库,需要同时安装扩展库。比如 SQL Server,需...

    丹枫无迹
  • Python:logging 的巧妙设计

    logging 的基本用法网上很多,这里就不介绍了。在引入正文之前,先来看一个需求:

    丹枫无迹
  • Python:What the f*ck Python(上)

    说明: 这些行为是由于 CPython 在编译优化时,某些情况下会尝试使用已经存在的不可变对象而不是每次都创建一个新对象。这种行为被称作字符串的驻留[stri...

    丹枫无迹
  • Python基础之公共方法

    python3中取消了cmp比较运算符,但我们可以直接通过比较运算符<>进行比较; 数字可以比较,字符串可以比较,元组,列表可以比较大小,但字典不能比较大小

    py3study
  • 关于WDCP,数据库外连的说明

    用户1191760
  • ​收藏 在Ubuntu14.04中配置mysql远程连接教程

    上一篇文章,小编带大家学会了在Ubuntu14.04中安装MySQL,没有来得及上课的小伙伴们可以戳这篇文章:如何在Ubuntu14.04中安装mysql,今天...

    Python进阶者
  • (总结)Web性能压力测试工具之ApacheBench(ab)详解

    PS:网站性能压力测试是性能调优过程中必不可少的一环。只有让服务器处在高压情况下才能真正体现出各种设置所暴露的问题。Apache中有个自带的,名为ab的程序,可...

    拓荒者
  • Spring Cloud微服务技术栈(二):搭建高可用Eureka Server、服务注册与发现

    在微服务架构中,服务治理是最为基本、最为核心的模块,它主要用来实现各个微服务实例的自动注册与发现。在互联网时代初期,微服务还未盛行之时,构建的服务完全可以使用静...

    itlemon
  • 在Ubuntu14.04中配置mysql远程连接教程

    上一篇文章,小编带大家学会了在Ubuntu14.04中安装MySQL,没有来得及上课的小伙伴们可以戳这篇文章:如何在Ubuntu14.04中安装mysql,今天...

    Python进阶者
  • 服务框架之注册中心,你不知道的内幕

    前一篇服务框架技术栈粗略分析了服务框架需要的各个核心模块,首先提到的就是注册中心,注册中心实现了服务注册和发现的功能,在服务框架中也发挥着重要的作用。今天主要围...

    涤生

扫码关注云+社区

领取腾讯云代金券