关于使用python logging模块的几点总结
关于使用python logging模块的几点总结
使用python的标准日志模块logging可以非常方便地记录日志。Python日志系统非常丰富。添加结构化或非结构化日志输出到python代码,写到文件,输出到控制台,发送到系统日志,或者自定义输出格式都很容易。
下面是我实践过程中遇到的一些经验和教训的总结。
1. 一个简单的日志系统示例
业务场景如下:
开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件
#!/usr/bin/env python
#encoding: utf-8import logging#创建一个logger实例
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)#创建一个handler,用于写入日志文件
fh = logging.FileHandler('simple_log.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('foobar')
运行后, 在控制台和日志文件都有一条日志:
2. logging模块的API
结合上面的例子,我们说下几个最常使用的API
logging.getLogger([name])
返回一个logger实例,如果没有指定name,返回root logger。
只要name相同,返回的logger实例都是同一个而且只有一个,即name和logger实例是一一对应的。这意味着,无需把logger实例在各个模块中传递。只要知道name,就能得到同一个logger实例
Logger.setLevel(lvl)
设置logger的level, level有以下几个级别:
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 logger创建一个StreamHandler,
设置默认的格式。
* 这些函数: logging.debug()、logging.info()、logging.warning()、
logging.error()、logging.critical() 如果调用的时候发现root logger没有任何
handler, 会自动调用basicConfig添加一个handler
* 如果root logger已有handler, 这个函数不做任何事情
使用basicConfig来配置root logger的输出格式和level:
import logging
logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
logging.debug('This message should appear on the console')
3. 日志对象间的层级结构
除了root logger, 实际上logger实例之间还有父子关系, root logger就是处于最顶层的logger, 它是所有logger的祖先。如下图:
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 level
logger有一个概念,叫effective level。 如果一个logger没有显示地设置level,那么它就
用父亲的level。如果父亲也没有显示地设置level, 就用父亲的父亲的level,以此推....
最后到达root logger,一定设置过level。默认为logging.WARNING
child loggers得到消息后,既把消息分发给它的handler处理,也会传递给所有祖先logger处理,
来看一个例子
#!/usr/bin/env python
#encoding: utf-8import logginglogging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
logging.debug('This message should appear on the console')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)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)c = logging.getLogger('foo.bar')
c.debug('foo')
输出如下:
可见,孩子logger没有任何handler,所以对消息不做处理。但是它把消息转发给了它的父亲以及root logger。最后输出四条日志。
参考文献
[1].http://kenby.iteye.com/blog/1162698
关于使用python logging模块的几点总结相关推荐
- python logging模块使用
python logging模块使用 logging模块 日志记录的重要性 在开发过程中,我们可以printf或者Debug来排查问题. 但是在生产环境中(黑盒环境)出现问题,我们并不能知道在运行的环 ...
- python logging模块使用_python logging模块使用
近来再弄一个小项目,已经到收尾阶段了.希望加入写log机制来增加程序出错后的判断分析.尝试使用了python logging模块. #-*- coding:utf-8 -*- importloggin ...
- Python logging模块切分和轮转日志
Python logging模块切分和轮转日志 logging 模块可以实现日志的输出和写入文件,但实际工作中,对于日志是使用不仅限于输出那么简单. logging基本使用参考:https://blo ...
- Python logging模块的基本使用
Python logging模块的基本使用 logging 模块是 Python 内置的标准模块,用于输出代码日志. 一.logging 模块简介 在工作中,运行的代码量是非常大的,为了更方便的管理代 ...
- python调用微信客户端_python模拟微信客户端打开链接Python Logging 模块研究
背景 在一个新的项目里面加入了日志功能,想自己写一个,但是一个偶然的机会,通过google发现Python内建了一个非常强大的日志(log)模块:logging.粗略的研究了一下,下面是我的一些心得札 ...
- python logging模块-写日志、log回滚
python包/模块,专栏总目录: 1.python自定义模块 2.python模块调用顺序 3.python logging模块 4.python定义跨模块的全局变量 1.logging模块简介 l ...
- Python Logging模块实现运行的程序写入 日志
参考文章: Python使用logging模块实现打印log到指定文件的方法_python_脚本之家 https://www.jb51.net/article/146909.htm 步骤: (1) ...
- python logging模块的作用_Python 日志模块logging分析及使用-2
本文作为Python日志模块的补充,主要介绍日志回滚RotatingFileHandler和TimedRotatingFileHandler的使用,以及其所带来的问题.Logger对象的日志等级是如何 ...
- Python logging模块日志存储位置踩坑
问题描述 项目过程中写了一个小模块,设计到了日志存储的问题,结果发现了个小问题. 代码结构如下: db.py run.py 其中db.py是操作数据库抽象出来的一个类,run.py是业务逻辑代码.两个 ...
最新文章
- spring的事务隔离_再深一点:面试工作两不误,源码级理解Spring事务
- Dreamer 3.0 支持json、xml、文件上传
- 七个步骤,带你快速读懂 RPC 框架原理
- 路由(二)——动态路由简介与RIP协议
- DB Intro - MongoDB User
- matlab解决无约束优化问题
- 51单片机几种精确延时(包含自动适应主时钟)
- Nginx页面乱码问题
- spring 的web.xml的加载顺序
- 悬镜安全宣布完成数千万元Pre-A轮融资
- FISCO BCOS区块链搭建说明(第一篇)
- THUSC2019:Illusory World
- 可以边玩游戏边学编程的手游盘点
- 项目敏捷管理模式有哪几种_敏捷团队中有效沟通的5种模式
- Office系列---将Office文件(Word、PPT、Excel)转换为PDF文件,提取Office文件(Word、PPT)中的所有图片
- ZCMU-1635- 超大型 LED 显示屏
- Docker 1.12.1初体验
- PTA乙级 1108 String复读机——20分
- 光模块中的DDM介绍
- iconfont与雪碧图的优缺点
热门文章
- 2022-2028年中国新能源环卫车行业深度调研与投资战略规划分析报告
- MySQL 学习笔记(17)— SQL 执行顺序
- MYSQL 连接数据库命令收藏
- GitHub上整理的一些工具【转载】
- 不同的source control下配置DiffMerge
- ORB_SLAM2概述
- 数字通信原理_光纤通信原理是什么 光纤通信应用领域介绍【图文】
- h5有缓存css,taro H5配置 cdn css js 缓存 hash 配置
- c语言怎样定义函数举例,c语言怎样定义函数?
- java fragment_Java Web Fragment在项目中使用方法详解