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 获取 Linux 系统信息的代码
Jul 13 Python
使用Python中的线程进行网络编程的入门教程
Apr 15 Python
Python md5与sha1加密算法用法分析
Jul 14 Python
django 创建过滤器的实例详解
Aug 14 Python
python中字符串比较使用is、==和cmp()总结
Mar 18 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
Apr 02 Python
使用Python的SymPy库解决数学运算问题的方法
Mar 27 Python
Python字符串匹配之6种方法的使用详解
Apr 08 Python
Python 最强编辑器详细使用指南(PyCharm )
Sep 16 Python
tensorflow生成多个tfrecord文件实例
Feb 17 Python
Python数组拼接np.concatenate实现过程
Apr 18 Python
Python识别处理照片中的条形码
Nov 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
ThinkPHP3.1新特性之多数据库操作更加完善
2014/06/19 PHP
PHP源码分析之变量的存储过程分解
2014/07/03 PHP
php中文繁体和简体相互转换的方法
2015/03/21 PHP
Zend Framework入门教程之Zend_Session会话操作详解
2016/12/08 PHP
jquery.lazyload  实现图片延迟加载jquery插件
2010/02/06 Javascript
浅谈JavaScript函数参数的可修改性问题
2013/12/05 Javascript
对 jQuery 中 data 方法的误解分析
2014/06/18 Javascript
jquery实现的鼠标下拉滚动置顶效果
2014/07/24 Javascript
jQuery实现鼠标划过展示大图的方法
2015/03/09 Javascript
jQuery使用slideUp方法实现控制元素缓慢收起
2015/03/27 Javascript
JavaScript对Cookie进行读写操作实例
2015/07/25 Javascript
js滑动提示效果代码分享
2016/03/10 Javascript
自己动手制作基于jQuery的Web页面加载进度条插件
2016/06/03 Javascript
深入掌握 react的 setState的工作机制
2017/09/27 Javascript
如何在vue中使用ts的示例代码
2018/02/28 Javascript
Node.js模块全局安装路径配置方法
2018/05/17 Javascript
iView-admin 动态路由问题的解决方法
2018/10/03 Javascript
微信小程序车牌号码模拟键盘输入功能的实现代码
2018/11/11 Javascript
详解JavaScript原型与原型链
2020/11/16 Javascript
Python中time模块与datetime模块在使用中的不同之处
2015/11/24 Python
django 开发忘记密码通过邮箱找回功能示例
2018/04/17 Python
Python实现TCP探测目标服务路由轨迹的原理与方法详解
2019/09/04 Python
Python制作一个仿QQ办公版的图形登录界面
2020/09/22 Python
html5 canvas fillRect坐标和大小的问题解决方法
2014/03/26 HTML / CSS
Nike台湾官方商店:Nike.com (TW)
2017/08/16 全球购物
27个经典Linux面试题及答案,你知道几个?
2013/01/10 面试题
怎样写好自荐信和推荐信
2013/12/26 职场文书
保密承诺书
2014/03/27 职场文书
2014年教师业务学习材料
2014/05/12 职场文书
就职演讲稿范文
2014/05/19 职场文书
2014年教师德育工作总结
2014/11/10 职场文书
自愿离婚协议书2015
2015/01/26 职场文书
十月围城观后感
2015/06/08 职场文书
家长会后的感想
2015/08/11 职场文书
校园音乐节目广播稿
2015/08/19 职场文书
Python Pandas数据分析之iloc和loc的用法详解
2021/11/11 Python