Python中logging.NullHandler 的使用教程


Posted in Python onNovember 29, 2018

在使用 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,具体的实现就交给调用的人去决定吧。

总结

以上所述是小编给大家介绍的Python中logging.NullHandler 的使用教程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
用python + hadoop streaming 分布式编程(一) -- 原理介绍,样例程序与本地调试
Jul 14 Python
Python实现Smtplib发送带有各种附件的邮件实例
Jun 05 Python
python机器学习实战之最近邻kNN分类器
Dec 20 Python
python 动态加载的实现方法
Dec 22 Python
pygame实现简易飞机大战
Sep 11 Python
详解重置Django migration的常见方式
Feb 15 Python
Python的互斥锁与信号量详解
Sep 12 Python
python基于socket实现的UDP及TCP通讯功能示例
Nov 01 Python
Python 一行代码能实现丧心病狂的功能
Jan 18 Python
python/golang实现循环链表的示例代码
Sep 14 Python
Python实现归一化算法详情
Mar 18 Python
Python 避免字典和元组的多重嵌套问题
Jul 15 Python
Mac下Anaconda的安装和使用教程
Nov 29 #Python
windows7 32、64位下python爬虫框架scrapy环境的搭建方法
Nov 29 #Python
解决pycharm py文件运行后停止按钮变成了灰色的问题
Nov 29 #Python
pycharm debug功能实现跳到循环末尾的方法
Nov 29 #Python
在PyCharm下打包*.py程序成.exe的方法
Nov 29 #Python
selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)
Nov 29 #Python
解决PyCharm的Python.exe已经停止工作的问题
Nov 29 #Python
You might like
在线增减.htpasswd内的用户
2006/10/09 PHP
php 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)
2010/05/16 PHP
php 数组的一个悲剧?
2011/05/11 PHP
表格展示无限级分类(PHP版)
2012/08/21 PHP
ThinkPHP3.1新特性之对Ajax的支持更加完善
2014/06/19 PHP
php上传图片之时间戳命名(保存路径)
2014/08/15 PHP
PHP实现更新中间关联表数据的两种方法
2014/09/01 PHP
php识别翻转iphone拍摄的颠倒图片
2018/05/17 PHP
一个JS的日期格式化算法示例
2013/07/31 Javascript
jQuery使用addClass()方法给元素添加多个class样式
2015/03/26 Javascript
javascript设计模式之对象工厂函数与构造函数详解
2015/07/30 Javascript
使用BootStrapValidator完成前端输入验证
2016/09/28 Javascript
jquery精度计算代码 jquery指定精确小数位
2017/02/06 Javascript
微信小程序 出现错误:{"baseresponse":{"errcode":-80002,"errmsg":""}}解决办法
2017/02/23 Javascript
React.Js添加与删除onScroll事件的方法详解
2017/11/03 Javascript
在HTML文档中嵌入JavaScript的四种方法
2018/05/07 Javascript
react build 后打包发布总结
2018/08/24 Javascript
vue响应式更新机制及不使用框架实现简单的数据双向绑定问题
2019/06/27 Javascript
修改NPM全局模式的默认安装路径的方法
2020/12/15 Javascript
[02:34]DOTA2英雄基础教程 幽鬼
2014/01/02 DOTA
Python实现快速多线程ping的方法
2015/07/15 Python
编写Python小程序来统计测试脚本的关键字
2016/03/12 Python
利用python打印出菱形、三角形以及矩形的方法实例
2017/08/08 Python
python3之模块psutil系统性能信息使用
2018/05/30 Python
python 处理telnet返回的More,以及get想要的那个参数方法
2019/02/14 Python
使用Python给头像戴上圣诞帽的图像操作过程解析
2019/09/20 Python
python在地图上画比例的实例详解
2020/11/13 Python
德国2018年度最佳在线药房:Bodfeld Apotheke
2019/11/04 全球购物
J2EE面试题
2016/03/14 面试题
市场营销管理制度
2014/01/29 职场文书
小学中秋节活动方案
2014/02/06 职场文书
2015年教师自我评价范文
2015/03/04 职场文书
幼儿园校车安全责任书
2015/05/08 职场文书
大学生军训感言
2015/08/01 职场文书
简短的人生哲理(38句)
2019/08/13 职场文书
详细聊聊Oracle表碎片对性能有多大的影响
2022/03/19 Oracle