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 连连看连接算法
Nov 22 Python
Python实现扫描指定目录下的子目录及文件的方法
Jul 16 Python
python常用知识梳理(必看篇)
Mar 23 Python
用tensorflow构建线性回归模型的示例代码
Mar 05 Python
pandas数据框,统计某列数据对应的个数方法
Apr 11 Python
Python中作用域的深入讲解
Dec 10 Python
Python分支语句与循环语句应用实例分析
May 07 Python
Python+opencv 实现图片文字的分割的方法示例
Jul 04 Python
win10下python2和python3共存问题解决方法
Dec 23 Python
python 统计文件中的字符串数目示例
Dec 24 Python
python3.7+selenium模拟淘宝登录功能的实现
May 26 Python
python向xls写入数据(包括合并,边框,对齐,列宽)
Feb 02 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
DedeCMS dede_channeltype表字段注释
2010/04/07 PHP
php缓存技术详细总结
2013/08/07 PHP
php实现的百度搜索某地天气的小偷代码
2014/04/23 PHP
php 解压rar文件及zip文件的方法
2014/05/05 PHP
JavaScript学习笔记之获取当前目录的实现代码
2010/12/14 Javascript
来自国外的30个基于jquery的Web下拉菜单
2012/06/22 Javascript
浅谈document.write()输出样式
2015/05/07 Javascript
jquery实现鼠标滑过后动态图片提示效果实例
2015/08/10 Javascript
js实现密码强度检测【附示例】
2016/03/30 Javascript
JS实现队列与堆栈的方法
2016/04/21 Javascript
JavaScript之cookie技术详解
2016/11/18 Javascript
js字符串操作总结(必看篇)
2016/11/22 Javascript
Vue-Router2.X多种路由实现方式总结
2018/02/09 Javascript
原生js实现移动端Touch轮播图的方法步骤
2019/01/03 Javascript
js实现简单抽奖功能
2020/11/24 Javascript
Antd表格滚动 宽度自适应 不换行的实例
2020/10/27 Javascript
python多重继承新算法C3介绍
2014/09/28 Python
Python 类与元类的深度挖掘 I【经验】
2016/05/06 Python
Python中死锁的形成示例及死锁情况的防止
2016/06/14 Python
Python enumerate索引迭代代码解析
2018/01/19 Python
python3对拉勾数据进行可视化分析的方法详解
2019/04/03 Python
python zip()函数使用方法解析
2019/10/31 Python
python实现发送带附件的邮件代码分享
2020/09/22 Python
pyx文件 生成pyd 文件用于 cython调用的实现
2021/03/04 Python
详解利用css3的var()实现运行时改变scss的变量值
2021/03/02 HTML / CSS
科颜氏加拿大官方网站: Kiehl’s加拿大
2016/08/16 全球购物
计算机专业自我鉴定
2013/10/15 职场文书
机械设计职业生涯规划书
2013/12/27 职场文书
食品委托检验协议书范本
2014/09/12 职场文书
2014年调度员工作总结
2014/11/19 职场文书
2014年行政工作总结
2014/11/19 职场文书
学习型家庭事迹材料
2014/12/20 职场文书
售后前台接待岗位职责
2015/04/03 职场文书
地球上的星星观后感
2015/06/02 职场文书
新员工实习期个人工作总结
2015/10/15 职场文书
centos环境下nginx高可用集群的搭建指南
2022/07/23 Servers