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之正规地说一句话
Sep 28 Python
10个易被忽视但应掌握的Python基本用法
Apr 01 Python
Python 判断是否为质数或素数的实例
Oct 30 Python
python pandas修改列属性的方法详解
Jun 09 Python
Python嵌套列表转一维的方法(压平嵌套列表)
Jul 03 Python
对python csv模块配置分隔符和引用符详解
Dec 12 Python
python实现维吉尼亚算法
Mar 20 Python
Python第三方包之DingDingBot钉钉机器人
Apr 09 Python
序列化Python对象的方法
Aug 01 Python
如何基于Python实现word文档重新排版
Sep 29 Python
Python 操作SQLite数据库的示例
Oct 16 Python
python 列表推导和生成器表达式的使用
Feb 01 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用mysql数据库存储session的代码
2010/03/05 PHP
PHP 类商品秒杀计时实现代码
2010/05/05 PHP
php中time()和mktime()方法的区别
2013/09/28 PHP
使用Jquery打造最佳用户体验的登录页面的实现代码
2011/07/08 Javascript
关于js日期转化为毫秒数“节省20%的效率和和节省9个字符“问题
2012/03/01 Javascript
js Calender控件使用详解
2015/01/05 Javascript
调试JavaScript中正则表达式中遇到的问题
2015/01/27 Javascript
JS实现点击颜色块切换指定区域背景颜色的方法
2015/02/25 Javascript
jQuery实现带滚动导航效果的全屏滚动相册实例
2015/06/19 Javascript
怎么限制input的text里输入的值只能是数字(正则、js)
2016/05/16 Javascript
浅析angularJS中的ui-router和ng-grid模块
2016/05/20 Javascript
AngularJS 遇到的小坑与技巧小结
2016/06/07 Javascript
ES6 Promise对象概念与用法分析
2017/04/01 Javascript
bootstrap如何让dropdown menu按钮式下拉框长度一致
2017/04/10 Javascript
JS分页的实现(同步与异步)
2017/09/16 Javascript
Nodejs处理异常操作示例
2018/12/25 NodeJs
通过jQuery学习js类型判断的技巧
2019/05/27 jQuery
[58:09]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第三场 6.2
2018/06/03 DOTA
Python 调用Java实例详解
2017/06/02 Python
Django 2.0版本的新特性抢先看!
2018/01/05 Python
python爬虫之线程池和进程池功能与用法详解
2018/08/02 Python
Python生成器的使用方法和示例代码
2019/03/04 Python
Python Django基础二之URL路由系统
2019/07/18 Python
Django框架组成结构、基本概念与文件功能分析
2019/07/30 Python
Python实现socket非阻塞通讯功能示例
2019/11/06 Python
深度学习入门之Pytorch 数据增强的实现
2020/02/26 Python
jupyter 使用Pillow包显示图像时inline显示方式
2020/04/24 Python
英国现代家具和照明购物网站:Heal’s
2019/10/30 全球购物
生日邀请函范文
2014/01/13 职场文书
社团2014年植树节活动总结
2014/03/11 职场文书
金融系毕业生自荐书
2014/07/08 职场文书
小学秋季运动会报道稿
2014/09/30 职场文书
行政申诉状范文
2015/05/20 职场文书
青涩记忆观后感
2015/06/18 职场文书
文艺有韵味的诗句(生命类、亲情类...)
2019/07/11 职场文书
《西游记》读后感(3篇)
2019/09/20 职场文书