python日志logging模块使用方法分析


Posted in Python onMay 23, 2019

本文实例讲述了python日志logging模块使用方法。分享给大家供大家参考,具体如下:

一、从一个使用场景开始

开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件

import logging
# 创建一个logger
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)
# 创建一个handler,用于写入日志文件
fh = logging.FileHandler('test.log')
fh.setLevel(logging.DEBUG)
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# 定义handler的输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 给logger添加handler
logger.addHandler(fh)
logger.addHandler(ch)
# 记录一条日志
logger.info('foorbar')

运行后, 在控制台和日志文件都有一条日志:

2011-08-31 19:18:29,816 - mylogger - INFO - foorbar

二、logging模块的API

结合上面的例子,我们说下几个最常使用的API

logging.getLogger([name])返回一个logger实例,如果没有指定name,返回root logger。只要name相同,返回的logger实例都是同一个而且只有一个,即name和logger实例是一一对应的。这意味着,无需把logger实例在各个模块中传递。只要知道name,就能得到同一个logger实例

Logger.setLevel(lvl)设置logger的level, level有以下几个级别:

python日志logging模块使用方法分析

NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL

如果把looger的级别设置为INFO, 那么小于INFO级别的日志都不输出, 大于等于INFO级别的日志都输出

logger.debug("foobar")  # 不输出
logger.info("foobar")    # 输出
logger.warning("foobar") # 输出
logger.error("foobar")   # 输出
logger.critical("foobar")  # 输出

Logger.addHandler(hdlr)logger可以雇佣handler来帮它处理日志, handler主要有以下几种:StreamHandler : 输出到控制台FileHandler :   输出到文件handler还可以设置自己的level以及输出格式。

logging.basicConfig([**kwargs])

这个函数用来配置root logger, 可以看它的源码,还是挺简单的。它首先检查root是否有handler,如果没有,那这个函数会创建一个StreamHandler,并设置默认的formatter。

然后将该handler添加到root。如果调用logging.basicConfig([**kwargs])的时候发现root logger已经有了handler,那该函数没有任何操作。

三、关于root logger以及logger的父子关系

前面多次提到root logger, 实际上logger实例之间还有父子关系, root logger就是处于最顶层的logger, 它是所有logger的祖先。如下图:

python日志logging模块使用方法分析

root logger是默认的logger,如果不创建logger实例, 直接调用logging.debug()、logging.info()logging.warning()、logging.error()、logging.critical()这些函数,那么使用的logger就是 root logger, 它可以自动创建,也是单实例的。

如何得到root logger通过logging.getLogger()或者logging.getLogger("")得到root logger实例。

默认的level:root logger默认的level是logging.WARNING

如何表示父子关系logger的name的命名方式可以表示logger之间的父子关系. 比如:parent_logger = logging.getLogger('foo')child_logger = logging.getLogger('foo.bar')

什么是effective levellogger有一个概念,叫effective level。 如果一个logger没有显示地设置level,那么它就用父亲的level。如果父亲也没有显示地设置level, 就用父亲的父亲的level,以此推....最后到达root logger,一定设置过level。默认为logging.WARNINGchild loggers得到消息后,既把消息分发给它的handler处理,也会传递给所有祖先logger处理,

来看一个例子

import logging
# 设置root logger
r = logging.getLogger()
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
r.addHandler(ch)
# 创建一个logger作为父亲
p = logging.getLogger('foo')
p.setLevel(logging.DEBUG)
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(message)s')
ch.setFormatter(formatter)
p.addHandler(ch)
# 创建一个孩子logger
c = logging.getLogger('foo.bar')
c.debug('foo')

输出如下:

2011-08-31 21:04:29,893 - foo
2011-08-31 21:04:29,893 - DEBUG - foo

可见, 孩子logger没有任何handler,所以对消息不做处理。但是它把消息转发给了它的父亲以及root logger。最后输出两条日志。

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python中使用glob和rmtree删除目录子目录及所有文件的例子
Nov 21 Python
Python中处理字符串的相关的len()方法的使用简介
May 19 Python
Python的Twisted框架上手前所必须了解的异步编程思想
May 25 Python
PyQt5每天必学之弹出消息框
Apr 19 Python
python计算两个地址之间的距离方法
Jun 09 Python
远程部署工具Fabric详解(支持Python3)
Jul 04 Python
OpenCV+face++实现实时人脸识别解锁功能
Aug 28 Python
django重新生成数据库中的某张表方法
Aug 28 Python
python绘制BA无标度网络示例代码
Nov 21 Python
django 文件上传功能的相关实例代码(简单易懂)
Jan 22 Python
Pytorch 扩展Tensor维度、压缩Tensor维度的方法
Sep 09 Python
Python调用腾讯API实现人脸身份证比对功能
Apr 04 Python
Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】
May 23 #Python
Django框架模板文件使用及模板文件加载顺序分析
May 23 #Python
Django框架登录加上验证码校验实现验证功能示例
May 23 #Python
python图形工具turtle绘制国际象棋棋盘
May 23 #Python
python os模块简单应用示例
May 23 #Python
python使用turtle绘制国际象棋棋盘
May 23 #Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
May 23 #Python
You might like
详解PHP实现定时任务的五种方法
2016/07/25 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
简单的JS多重继承示例
2008/03/13 Javascript
IE6,IE7,IE8下使用Javascript记录光标选中范围(已补全)
2011/08/28 Javascript
Jquery事件的连接使用示例
2013/06/18 Javascript
Event altKey,ctrlKey,shiftKey属性解析
2013/12/18 Javascript
现如今最流行的JavaScript代码规范
2014/03/08 Javascript
如何将php数组或者对象传递给javascript
2014/03/20 Javascript
js实现匹配时换色的输入提示特效代码
2015/08/17 Javascript
jquery判断复选框是否被选中的方法
2015/10/16 Javascript
js闭包引起的事件注册问题介绍
2016/03/29 Javascript
jQuery EasyUI框架中的Datagrid数据表格组件结构详解
2016/06/09 Javascript
微信开发 js实现tabs选项卡效果
2016/10/28 Javascript
微信小程序 页面传参实例详解
2016/11/16 Javascript
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
2017/06/12 jQuery
Nodejs之http的表单提交
2017/07/07 NodeJs
vue组件间通信六种方式(总结篇)
2019/05/15 Javascript
微信小程序新闻网站详情页实例代码
2020/01/10 Javascript
简单了解JavaScript arguement原理及作用
2020/05/28 Javascript
vue 页面回退mounted函数不执行的解决方案
2020/07/26 Javascript
VUE动态生成word的实现
2020/07/26 Javascript
[01:13:18]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
详细解析Python当中的数据类型和变量
2015/04/25 Python
Python3实现的旋转矩阵图像算法示例
2019/04/03 Python
python matplotlib中的subplot函数使用详解
2020/01/19 Python
Pytest mark使用实例及原理解析
2020/02/22 Python
python代码实现TSNE降维数据可视化教程
2020/02/28 Python
python实现FTP循环上传文件
2020/03/20 Python
canvas实现圆绘制的示例代码
2019/09/11 HTML / CSS
Html+Css+Jquery实现左侧滑动拉伸导航菜单栏的示例代码
2020/03/17 HTML / CSS
意大利在线药房:Saninforma
2021/02/11 全球购物
马云的职业生涯规划之路
2014/01/01 职场文书
幼儿园中班下学期评语
2014/04/18 职场文书
保安公司服务承诺书
2014/05/28 职场文书
环保建议书作文500字
2015/09/14 职场文书
关于CSS自定义属性与前端页面的主题切换问题
2022/03/21 HTML / CSS