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的Twisted框架中reactor事件管理器的用法
May 25 Python
Python实现向服务器请求压缩数据及解压缩数据的方法示例
Jun 09 Python
Python 比较两个数组的元素的异同方法
Aug 17 Python
python 删除大文件中的某一行(最有效率的方法)
Aug 19 Python
查看Django和flask版本的方法
May 14 Python
启动Atom并运行python文件的步骤
Nov 09 Python
对django中foreignkey的简单使用详解
Jul 28 Python
python PyQt5/Pyside2 按钮右击菜单实例代码
Aug 17 Python
python argparser的具体使用
Nov 10 Python
python 实现dict转json并保存文件
Dec 05 Python
Python实现数字的格式化输出
Aug 01 Python
一行代码python实现文件共享服务器
Apr 22 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
destoon实现资讯信息前面调用它所属分类的方法
2014/07/15 PHP
win平台安装配置Nginx+php+mysql 环境
2016/01/12 PHP
对laravel的csrf 防御机制详解,及form中csrf_token()的存在介绍
2019/10/24 PHP
让whoops帮我们告别ThinkPHP6的异常页面
2020/03/02 PHP
JS 判断undefined的实现代码
2009/11/26 Javascript
window.js 主要包含了页面的一些操作
2009/12/23 Javascript
jQuery+CSS 实现的超Sexy下拉菜单
2010/01/17 Javascript
jquery下实现overlay遮罩层代码
2010/08/25 Javascript
基于jquery的固定表头和列头的代码
2012/05/03 Javascript
解决jquery插件冲突的问题
2014/01/23 Javascript
js数组去重的方法汇总
2015/07/29 Javascript
Uploadify上传文件方法
2016/03/16 Javascript
JS中的hasOwnProperty()和isPrototypeOf()属性实例详解
2016/08/11 Javascript
轻松实现js弹框显示选项
2016/09/13 Javascript
AngularJs ng-repeat 嵌套如何获取外层$index
2016/09/21 Javascript
纯javascript版日历控件
2016/11/24 Javascript
js实现常见的工具条效果
2017/03/02 Javascript
浅谈react受控组件与非受控组件(小结)
2018/02/09 Javascript
jQuery实现鼠标滑过商品小图片上显示对应大图片功能【测试可用】
2018/04/27 jQuery
JS中的JSON对象的定义和取值实现代码
2018/05/09 Javascript
基于vue中对鼠标划过事件的处理方式详解
2018/08/22 Javascript
使用apifm-wxapi快速开发小程序过程详解
2019/08/05 Javascript
微信小程序12行js代码自己写个滑块功能(推荐)
2020/07/15 Javascript
老生常谈进程线程协程那些事儿
2017/07/24 Python
神经网络python源码分享
2017/12/15 Python
Python函数__new__及__init__作用及区别解析
2020/08/31 Python
Python 爬取淘宝商品信息栏目的实现
2021/02/06 Python
韩国邮政旗下生鲜食品网上超市:epost
2016/08/27 全球购物
科沃斯机器人官网商城:Ecovacs
2016/08/29 全球购物
大学生写自荐信的技巧
2014/01/08 职场文书
供货协议书
2014/04/22 职场文书
关于十八大的演讲稿
2014/09/15 职场文书
工作迟到检讨书范文
2015/05/06 职场文书
爱心捐赠活动简讯
2015/07/20 职场文书
简述Java中throw-throws异常抛出
2021/08/07 Java/Android
Java后端 Dubbo retries 超时重试机制的解决方案
2022/04/14 Java/Android