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的Flask框架中实现单元测试的教程
Apr 20 Python
搞笑的程序猿:看看你是哪种Python程序员
Jun 12 Python
Python编程之字符串模板(Template)用法实例分析
Jul 22 Python
Python实现抢购IPhone手机
Feb 07 Python
使用Python AIML搭建聊天机器人的方法示例
Jul 09 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
Feb 19 Python
使用Python做定时任务及时了解互联网动态
May 15 Python
在Python中append以及extend返回None的例子
Jul 20 Python
Python常用模块os.path之文件及路径操作方法
Dec 03 Python
Python模拟伯努利试验和二项分布代码实例
May 27 Python
Python使用pickle进行序列化和反序列化的示例代码
Sep 22 Python
Python读取ini配置文件传参的简单示例
Jan 05 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
第十二节--类的自动加载
2006/11/16 PHP
PHP中捕获超时事件的方法实例
2015/02/12 PHP
php简单生成随机数的方法
2015/07/30 PHP
Yii 2.0在Grid中格式化时间方法示例
2017/06/06 PHP
验证用户是否修改过页面的数据的实现方法
2008/09/26 Javascript
JavaScript 应用技巧集合[推荐]
2009/08/30 Javascript
jquery插件开发注意事项小结
2013/06/04 Javascript
jQuery实现可收缩展开的级联菜单实例代码
2013/11/27 Javascript
jquery中map函数遍历数组用法实例
2015/05/18 Javascript
jQuery实现hover合成事件的方法
2015/08/06 Javascript
基于javascript简单实现对身份证校验
2021/01/25 Javascript
JS弹出新窗口被拦截的解决方法
2016/08/09 Javascript
利用jquery实现实时更新歌词的方法
2017/01/06 Javascript
javascript 玩转Date对象(实例讲解)
2017/07/11 Javascript
浅谈nodejs中的类定义和继承的套路
2017/07/26 NodeJs
JavaScrip数组删除特定元素的几种方法总结
2017/09/06 Javascript
详解vue组件开发脚手架
2018/06/15 Javascript
vue表单验证你真的会了吗?vue表单验证(form)validate
2019/04/07 Javascript
vue使用echarts画组织结构图
2021/02/06 Vue.js
[01:48]完美圣典齐天大圣至宝宣传片
2016/12/17 DOTA
跟老齐学Python之集合(set)
2014/09/24 Python
Python开发如何在ubuntu 15.10 上配置vim
2016/01/25 Python
解决Tensorflow使用pip安装后没有model目录的问题
2018/06/13 Python
python绘制双Y轴折线图以及单Y轴双变量柱状图的实例
2019/07/08 Python
简单了解django orm中介模型
2019/07/30 Python
浅谈Python中os模块及shutil模块的常规操作
2020/04/03 Python
学生如何注册Pycharm专业版以及pycharm的安装
2020/09/24 Python
简述Html5 IphoneX 适配方法
2018/02/08 HTML / CSS
加拿大廉价机票预订网站:CheapOair.ca
2018/03/04 全球购物
美国经典刺绣和字母儿童服装特卖:Smocked Auctions
2018/07/16 全球购物
巴西服装和鞋子购物网站:Marisa
2018/10/25 全球购物
Internal修饰符有什么含义
2013/07/10 面试题
可以使用抽象函数重写基类中的虚函数吗
2013/06/02 面试题
公证委托书格式
2014/09/13 职场文书
2014基层党员批评与自我批评范文
2014/09/24 职场文书
廉洁自律心得体会2016
2016/01/13 职场文书