python中 logging的使用详解


Posted in Python onOctober 25, 2017

日志是用来记录程序在运行过程中发生的状况,在程序开发过程中添加日志模块能够帮助我们了解程序运行过程中发生了哪些事件,这些事件也有轻重之分。

根据事件的轻重可分为以下几个级别:

DEBUG: 详细信息,通常仅在诊断问题时才受到关注。整数level=10

INFO: 确认程序按预期工作。整数level=20

WARNING:出现了异常,但是不影响正常工作.整数level=30

ERROR:由于某些原因,程序 不能执行某些功能。整数level=40

CRITICAL:严重的错误,导致程序不能运行。整数level=50

默认的级别是WARNING,也就意味着只有级别大于等于的才会被看到,跟踪日志的方式可以是写入到文件中,也可以直接输出到控制台。

输出到控制台

下面是一个小例子通过将日志输出到控制台的方法:

import logging
logging.warning('Watch out!') # 将输出到控制台
logging.info('I told you so') # 不会输出
logging.error("an error occurrence!") #将输出到控制台

输出结果

WARNING:root:Watch out!
ERROR:root:an error occurrence

输出到文件中

新开一个python解释器,确保不是上面代码的session

import logging
logging.basicConfig(filename='example.log',level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')

这个时候控制台上面就没有了输出,文件example.log中的内容

DEBUG:root:This message should go to the log file
INFO:root:So should this
WARNING:root:And this, too

假定需要手动调整日志的级别,我们可以在命令行以参数的形式传入--log=INFO,在代码中可以采用下面的处理方式

# 输入参数 --log=DEBUG or --log=debug
numeric_level = getattr(logging, loglevel.upper(), None)#返回10,否则None
if not isinstance(numeric_level, int):
 raise ValueError('Invalid log level: %s' % loglevel)
logging.basicConfig(level=numeric_level, ...)

变量的日志

使用格式化字符串的方式,为变量添加日志

import logging
logging.warning('%s before you %s', 'Look', 'leap!')

自定义日志格式

我们还可以根据我们的需求自定义输出模板

import logging
logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s',level=logging.DEBUG)
logging.debug('This message should appear on the console')
logging.info('So should this')
logging.warning('And this, too')

输出

2017-10-24 14:03:53,671: DEBUG: This message should appear on the console
2017-10-24 14:03:53,690: INFO: So should this
2017-10-24 14:03:53,694: WARNING: And this, too

内部实际传入的为一个字典,%(key)为字典的key。

上面是python logging模块的一些基本用法, 已经能够满足我们的许多需求,下面简单介绍下logging的一些高级用法。在logging模块中主要包括logger,handlers,filter,formatters,这几个组件

logger:提供了应用接口,供程序使用
handlers:用来将logger创建的log 发送到相应的目的地
filter:为要输出的日志提供了更细粒度的设置
formatters:设置最终的输出格式

下面是这几个组件配合使用的例子

import logging
logger = logging.getLogger('logger_name')# 创建logger对象
logger.setLevel(logging.DEBUG)
handler = logging.StreamHandler()# 创建 console handler 并设置级别为debug
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')# 创建输出格式
handler.setFormatter(formatter)# 为handler添加fromatter
logger.addHandler(handler)# 将handler添加到 logger
logger.debug('debug message')# 'application' code
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')

输出结果:

2017-10-24 16:50:43,127 - logger_name - DEBUG - debug message
2017-10-24 16:50:43,138 - logger_name - INFO - info message
2017-10-24 16:50:43,141 - logger_name - WARNING - warn message
2017-10-24 16:50:43,144 - logger_name - ERROR - error message
2017-10-24 16:50:43,148 - logger_name - CRITICAL - critical message

小应用案例

下面是自己定义的一个日志处理方法,既能够写入到文件中(滚动保存近15天的日志,日志格式app.log, app.log.1, app.log.2),又能输出到控制台。

import logging
from logging.handlers import TimedRotatingFileHandler
class MylogHandler(logging.Logger):
 def __init__(self,name,level="DEBUG",stream=True,files=True):
  self.name = name
  self.level = level
  logging.Logger.__init__(self,self.name,level=self.level)
  if stream:
   self.__streamHandler__(self.level)
  if files:
   self.__filesHandler__(self.level)
 def __streamHandler__(self,level=None):
  handler = TimedRotatingFileHandler(filename=self.name+".log", when='D', interval=1, backupCount=15)
  handler.suffix = '%Y%m%d.log'
  handler.setLevel(level)
  formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
  handler.setFormatter(formatter)
  self.addHandler(handler) #将hander添加到logger上
 def __filesHandler__(self,level=None):
  handler = logging.StreamHandler()
  formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
  handler.setFormatter(formatter)
  handler.setLevel(level)
  self.addHandler(handler)
if __name__ == '__main__':
 log = MylogHandler('test')
 log.info('this is a my log handler')

总结

以上所述是小编给大家介绍的python中 logging的使用详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python通过线程实现定时器timer的方法
Mar 16 Python
讲解Python中的标识运算符
May 14 Python
PyQt5实现无边框窗口的标题拖动和窗口缩放
Apr 19 Python
django解决跨域请求的问题
Nov 11 Python
Python查找最长不包含重复字符的子字符串算法示例
Feb 13 Python
使用python serial 获取所有的串口名称的实例
Jul 02 Python
让Python脚本暂停执行的几种方法(小结)
Jul 11 Python
django创建超级用户时指定添加其它字段方式
May 14 Python
Python爬虫JSON及JSONPath运行原理详解
Jun 04 Python
python爬虫基础之urllib的使用
Dec 31 Python
基于python+selenium自动健康打卡的实现代码
Jan 13 Python
Python连续赋值需要注意的一些问题
Jun 03 Python
python下载文件记录黑名单的实现代码
Oct 24 #Python
基于python中staticmethod和classmethod的区别(详解)
Oct 24 #Python
Flask数据库迁移简单介绍
Oct 24 #Python
python里使用正则表达式的组嵌套实例详解
Oct 24 #Python
Scrapy的简单使用教程
Oct 24 #Python
详解python里使用正则表达式的分组命名方式
Oct 24 #Python
在python中使用正则表达式查找可嵌套字符串组
Oct 24 #Python
You might like
php的计数器程序
2006/10/09 PHP
PHP迭代器实现斐波纳契数列的函数
2013/11/12 PHP
推荐一款MAC OS X 下php集成开发环境mamp
2014/11/08 PHP
PHP bin2hex()函数基础实例讲解
2019/02/11 PHP
兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码
2011/11/30 Javascript
JavaScript将数据转换成整数的方法
2014/01/04 Javascript
jQuery事件绑定用法详解
2016/09/08 Javascript
jquery 抽奖小程序实现代码
2016/10/12 Javascript
Nodejs下DNS缓存问题浅析
2016/11/16 NodeJs
基于input框覆盖掉数字英文的实例讲解
2017/07/21 Javascript
微信小程序实现文字跑马灯效果
2020/05/26 Javascript
vue.js实现点击后动态添加class及删除同级class的实现代码
2018/04/04 Javascript
20个最常见的jQuery面试问题及答案
2018/05/23 jQuery
layui中table表头样式修改方法
2018/08/15 Javascript
vue利用v-for嵌套输出多层对象,分别输出到个表的方法
2018/09/07 Javascript
JavaScript类的继承操作实例总结
2018/12/20 Javascript
推荐15个最好用的JavaScript代码压缩工具
2019/02/13 Javascript
详解如何在Vue项目中发送jsonp请求
2019/10/25 Javascript
js回调函数仿360开机
2019/12/26 Javascript
js实现圆形显示鼠标单击位置
2020/02/11 Javascript
基于Vue全局组件与局部组件的区别说明
2020/08/11 Javascript
javascript实现打砖块小游戏(附完整源码)
2020/09/18 Javascript
解决nuxt 自定义全局方法,全局属性,全局变量的问题
2020/11/05 Javascript
[01:38]2018DOTA2亚洲邀请赛主赛事第二日现场采访 神秘商人痛陈生计不易
2018/04/05 DOTA
使用PDB模式调试Python程序介绍
2015/04/05 Python
浅析Python中else语句块的使用技巧
2016/06/16 Python
Python实现的三层BP神经网络算法示例
2018/02/07 Python
python 使用递归回溯完美解决八皇后的问题
2020/02/26 Python
Python如何批量获取文件夹的大小并保存
2020/03/31 Python
英国最大的自有市场,比亚马逊便宜:Flubit
2019/03/19 全球购物
小学班主任个人总结
2015/03/03 职场文书
2014年度个人总结范文
2015/03/09 职场文书
2015年重阳节活动总结
2015/03/24 职场文书
实验心得体会范文
2016/01/25 职场文书
postgresql使用filter进行多维度聚合的解决方法
2021/07/16 PostgreSQL
Python软件包安装的三种常见方法
2022/07/07 Python