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入门及进阶笔记 Python 内置函数小结
Aug 09 Python
Python读取mp3中ID3信息的方法
Mar 05 Python
简单谈谈Python中函数的可变参数
Sep 02 Python
python的exec、eval使用分析
Dec 11 Python
linux下python使用sendmail发送邮件
May 22 Python
Python中的Django基本命令实例详解
Jul 15 Python
解决tensorflow模型参数保存和加载的问题
Jul 26 Python
python用post访问restful服务接口的方法
Dec 07 Python
基于pandas中expand的作用详解
Dec 17 Python
如何使用PyCharm将代码上传到GitHub上(图文详解)
Apr 27 Python
Python实现壁纸下载与轮换
Oct 19 Python
Python爬虫开发与项目实战
Dec 16 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
我的论坛源代码(八)
2006/10/09 PHP
php 模拟post_验证页面的返回状态(实例讲解)
2013/10/28 PHP
PHP实现的多彩标签效果代码分享
2014/08/21 PHP
浅析php静态方法与非静态方法的用法区别
2016/05/17 PHP
加载 Javascript 最佳实践
2011/10/30 Javascript
关于js日期转化为毫秒数“节省20%的效率和和节省9个字符“问题
2012/03/01 Javascript
jQuery aminate方法定位到页面具体位置
2013/12/26 Javascript
JavaScript DOM节点添加示例
2014/07/16 Javascript
jQuery过滤选择器用法分析
2015/02/10 Javascript
详解vue.js的事件处理器v-on:click
2017/06/27 Javascript
JavaScript实现简单图片轮播效果
2017/08/21 Javascript
基于node.js express mvc轻量级框架实践
2017/09/14 Javascript
webpack4 CSS Tree Shaking的使用
2018/09/03 Javascript
JavaScript使用类似break机制中断forEach循环的方法
2018/11/13 Javascript
JS将时间秒转换成天小时分钟秒的字符串
2019/07/10 Javascript
vue和iview实现Scroll 数据无限滚动功能
2019/10/31 Javascript
vue 使用rules对表单字段进行校验的步骤
2020/12/25 Vue.js
python利用lxml读写xml格式的文件
2017/08/10 Python
Python实现输出程序执行进度百分比的方法
2017/09/16 Python
numpy.linspace函数具体使用详解
2019/05/27 Python
python库skimage给灰度图像染色的方法示例
2020/04/27 Python
python3.7中安装paddleocr及paddlepaddle包的多种方法
2020/11/27 Python
Desigual德国官网:在线购买原创服装
2018/03/27 全球购物
尼克松手表官网:Nixon手表
2019/03/17 全球购物
size?荷兰官方网站:英国高级运动鞋精品店
2020/07/24 全球购物
超级搞笑检讨书
2014/01/15 职场文书
光盘行动倡议书
2014/02/02 职场文书
生产部岗位职责范文
2014/02/07 职场文书
葛优非诚勿扰搞笑征婚台词
2014/03/17 职场文书
开学典礼主持词
2014/03/19 职场文书
4S店售后客服自我评价
2014/04/09 职场文书
银行先进个人事迹材料
2014/05/11 职场文书
2014幼儿园大班工作总结
2014/11/10 职场文书
毕业证明模板
2015/06/19 职场文书
环境卫生标语
2015/08/03 职场文书
基于MySql验证的vsftpd虚拟用户
2021/11/07 MySQL