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压缩和解压缩zip文件
Feb 14 Python
Python网页解析利器BeautifulSoup安装使用介绍
Mar 17 Python
python实现可视化动态CPU性能监控
Jun 21 Python
django认证系统实现自定义权限管理的方法
Jul 16 Python
基于Python实现迪杰斯特拉和弗洛伊德算法
May 27 Python
Python使用type关键字创建类步骤详解
Jul 23 Python
解决Django加载静态资源失败的问题
Jul 28 Python
python防止随意修改类属性的实现方法
Aug 21 Python
Python PyInstaller库基本使用方法分析
Dec 12 Python
解决python对齐错误的方法
Jul 16 Python
python文件路径操作方法总结
Dec 21 Python
Django展示可视化图表的多种方式
Apr 08 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使用curl检测网页是否被百度收录的示例分享
2014/01/31 PHP
Zend Framework使用Zend_Loader组件动态加载文件和类用法详解
2016/12/09 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
自动检查并替换文本框内的字符
2006/06/30 Javascript
iis6+javascript Add an Extension File
2007/06/13 Javascript
网易JS面试题与Javascript词法作用域说明
2010/11/09 Javascript
jquery动态切换背景图片的简单实现方法
2016/05/14 Javascript
Three.js快速入门教程
2016/09/09 Javascript
js 文字超出长度用省略号代替,鼠标悬停并以悬浮框显示实例
2016/12/06 Javascript
vue实现ToDoList简单实例
2017/02/07 Javascript
JS数组操作之增删改查的简单实现
2017/08/21 Javascript
Vue2.0 slot分发内容与props验证的方法
2017/12/12 Javascript
jQuery实现手机号正则验证输入及自动填充空格功能
2018/01/02 jQuery
基于Vue实现可以拖拽的树形表格实例详解
2018/10/18 Javascript
jquery层次选择器的介绍
2019/01/18 jQuery
Vue自定义组件的四种方式示例详解
2020/02/28 Javascript
vue组件添加事件@click.native操作
2020/10/30 Javascript
Python常用的日期时间处理方法示例
2015/02/08 Python
用Python实现随机森林算法的示例
2017/08/24 Python
浅谈Python 多进程默认不能共享全局变量的问题
2019/01/11 Python
Flask框架踩坑之ajax跨域请求实现
2019/02/22 Python
Python实现监控Nginx配置文件的不同并发送邮件报警功能示例
2019/02/26 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
2020/02/07 Python
python 识别登录验证码图片功能的实现代码(完整代码)
2020/07/03 Python
python 实现性别识别
2020/11/21 Python
英国户外装备和冒险服装零售商:alloutdoor
2018/01/30 全球购物
美国农场鲜花速递:The Bouqs
2018/07/13 全球购物
YOOX台湾:意大利奢侈品电商
2018/10/13 全球购物
英国旅行箱包和行李箱购物网站:Travel Luggage & Cabin Bags
2019/08/26 全球购物
俄罗斯最大的隐形眼镜销售网站:Ochkov.Net
2021/02/07 全球购物
SQL Server 2000数据库的文件有哪些,分别进行描述
2013/03/30 面试题
大学毕业的自我鉴定
2013/10/08 职场文书
管理失职检讨书范文
2015/05/05 职场文书
2015年七年级班主任工作总结
2015/05/21 职场文书
python使用pygame创建精灵Sprite
2021/04/06 Python
MySQL中CURRENT_TIMESTAMP的使用方式
2021/11/27 MySQL