Python如何给函数库增加日志功能


Posted in Python onAugust 04, 2020

问题

你想给某个函数库增加日志功能,但是又不能影响到那些不使用日志功能的程序。

解决方案

对于想要执行日志操作的函数库而已,你应该创建一个专属的 logger 对象,并且像下面这样初始化配置:

# somelib.py

import logging
log = logging.getLogger(__name__)
log.addHandler(logging.NullHandler())

# Example function (for testing)
def func():
  log.critical('A Critical Error!')
  log.debug('A debug message')

使用这个配置,默认情况下不会打印日志。例如:

>>> import somelib
>>> somelib.func()
>>>

不过,如果配置过日志系统,那么日志消息打印就开始生效,例如:

>>> import logging
>>> logging.basicConfig()
>>> somelib.func()
CRITICAL:somelib:A Critical Error!
>>>

讨论

通常来讲,你不应该在函数库代码中自己配置日志系统,或者是已经假定有个已经存在的日志配置了。

调用 getLogger(__name__) 创建一个和调用模块同名的logger模块。 由于模块都是唯一的,因此创建的logger也将是唯一的。

log.addHandler(logging.NullHandler()) 操作将一个空处理器绑定到刚刚已经创建好的logger对象上。 一个空处理器默认会忽略调用所有的日志消息。 因此,如果使用该函数库的时候还没有配置日志,那么将不会有消息或警告出现。

还有一点就是对于各个函数库的日志配置可以是相互独立的,不影响其他库的日志配置。 例如,对于如下的代码:

>>> import logging
>>> logging.basicConfig(level=logging.ERROR)

>>> import somelib
>>> somelib.func()
CRITICAL:somelib:A Critical Error!

>>> # Change the logging level for 'somelib' only
>>> logging.getLogger('somelib').level=logging.DEBUG
>>> somelib.func()
CRITICAL:somelib:A Critical Error!
DEBUG:somelib:A debug message
>>>

在这里,根日志被配置成仅仅输出ERROR或更高级别的消息。 不过 ,somelib 的日志级别被单独配置成可以输出debug级别的消息,它的优先级比全局配置高。 像这样更改单独模块的日志配置对于调试来讲是很方便的, 因为你无需去更改任何的全局日志配置——只需要修改你想要更多输出的模块的日志等级。

Logging HOWTO 详细介绍了如何配置日志模块和其他有用技巧,可以参阅下。

以上就是Python如何给函数库增加日志功能的详细内容,更多关于Python给函数库增加日志功能的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
urllib和BeautifulSoup爬取维基百科的词条简单实例
Jan 17 Python
Python图像处理之简单画板实现方法示例
Aug 30 Python
Python socket实现多对多全双工通信的方法
Feb 13 Python
django 通过URL访问上传的文件方法
Jul 28 Python
python禁用键鼠与提权代码实例
Aug 16 Python
python解释器spython使用及原理解析
Aug 24 Python
wxPython:python首选的GUI库实例分享
Oct 05 Python
Python3的unicode编码转换成中文的问题及解决方案
Dec 10 Python
Python字典底层实现原理详解
Dec 18 Python
Python中断多重循环的几种方式详解
Feb 10 Python
详解Python 循环嵌套
Jul 09 Python
python实现每天自动签到领积分的示例代码
Aug 18 Python
pycharm导入源码的具体步骤
Aug 04 #Python
python根据用户需求输入想爬取的内容及页数爬取图片方法详解
Aug 03 #Python
Python 如何调试程序崩溃错误
Aug 03 #Python
Python 捕获代码中所有异常的方法
Aug 03 #Python
Python连接mysql数据库及简单增删改查操作示例代码
Aug 03 #Python
Python pip使用超时问题解决方案
Aug 03 #Python
python时间序列数据转为timestamp格式的方法
Aug 03 #Python
You might like
PHP中ini_set与ini_get用法实例
2014/11/04 PHP
Thinkphp搜索时首页分页和搜索页保持条件分页的方法
2014/12/05 PHP
获取div编辑框,textarea,input text的光标位置 兼容IE,FF和Chrome的方法介绍
2012/11/08 Javascript
通过隐藏iframe实现文件下载的js方法介绍
2014/02/26 Javascript
JQuery右键菜单插件ContextMenu使用指南
2014/12/19 Javascript
jQuery Validation PlugIn的使用方法详解
2015/12/18 Javascript
使用Angular.js开发的注意事项
2016/10/19 Javascript
微信小程序 定义全局数据、函数复用、模版等详细介绍
2016/10/27 Javascript
Angular请求防抖处理第一次请求失效问题
2019/05/17 Javascript
Vue使用Proxy监听所有接口状态的方法实现
2019/06/07 Javascript
JavaScript实现旋转木马轮播图
2020/03/16 Javascript
Vue 打包体积优化方案小结
2020/05/20 Javascript
vue 使用饿了么UI仿写teambition的筛选功能
2021/03/01 Vue.js
[54:41]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VGJ.T VS paiN
2018/03/31 DOTA
python中精确输出JSON浮点数的方法
2014/04/18 Python
Python函数中定义参数的四种方式
2014/11/30 Python
老生常谈Python序列化和反序列化
2017/06/28 Python
python使用mysql的两种使用方式
2018/03/07 Python
python调用百度语音识别实现大音频文件语音识别功能
2018/08/30 Python
Django用户认证系统 组与权限解析
2019/08/02 Python
Django--权限Permissions的例子
2019/08/28 Python
win10下安装Anaconda的教程(python环境+jupyter_notebook)
2019/10/23 Python
python paramiko远程服务器终端操作过程解析
2019/12/14 Python
Python continue语句实例用法
2020/02/06 Python
python3.8动态人脸识别的实现示例
2020/09/21 Python
DRF使用simple JWT身份验证的实现
2021/01/14 Python
详解canvas drawImage()方法绘制图片不显示的问题
2018/10/08 HTML / CSS
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
2014/05/08 HTML / CSS
教你使用Canvas处理图片的方法
2017/11/28 HTML / CSS
巧克力领导品牌瑞士莲美国官网:Lindt Chocolate美国
2016/08/25 全球购物
英国Boots旗下太阳镜网站:Boots Designer Sunglasses
2018/07/07 全球购物
美国翻新电子产品商店:The Store
2019/10/08 全球购物
怎样声明子类
2013/07/02 面试题
期中考试反思800字
2014/05/01 职场文书
合伙购房协议样本
2014/10/06 职场文书
高中班主任心得体会
2016/01/07 职场文书