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使用xlrd模块读写Excel文件的方法
May 06 Python
利用 Monkey 命令操作屏幕快速滑动
Dec 07 Python
用Python将一个列表分割成小列表的实例讲解
Jul 02 Python
python flask搭建web应用教程
Nov 19 Python
python求绝对值的三种方法小结
Dec 04 Python
python sitk.show()与imageJ结合使用常见的问题
Apr 20 Python
Scrapy框架介绍之Puppeteer渲染的使用
Jun 19 Python
解决tensorflow 释放图,删除变量问题
Jun 23 Python
基于tf.shape(tensor)和tensor.shape()的区别说明
Jun 30 Python
python实现画图工具
Aug 27 Python
matplotlib事件处理基础(事件绑定、事件属性)
Feb 03 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
Mar 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
无限级别菜单的实现
2006/10/09 PHP
PHP函数preg_match_all正则表达式的基本使用详细解析
2013/08/31 PHP
php遍历目录输出目录及其下的所有文件示例
2014/01/27 PHP
destoon之一键登录设置
2014/06/21 PHP
php查找字符串中第一个非0的位置截取
2017/02/27 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
2018/06/16 PHP
ext实现完整的登录代码
2008/08/08 Javascript
锋利的jQuery 第三章章节总结的例子
2010/03/23 Javascript
javascript中简单的进制转换代码实例
2013/10/26 Javascript
JS 删除字符串最后一个字符的实现代码
2014/02/20 Javascript
jqeury-easyui-layout问题解决方法
2014/03/24 Javascript
javascript框架设计之浏览器的嗅探和特征侦测
2015/06/23 Javascript
js实现匹配时换色的输入提示特效代码
2015/08/17 Javascript
AngularJS单选框及多选框实现双向动态绑定
2016/01/13 Javascript
NodeJs的优势和适合开发的程序
2016/08/14 NodeJs
详解AngularJs ui-router 路由的简单介绍
2017/04/26 Javascript
JavaScript使用FileReader实现图片上传预览效果
2020/03/27 Javascript
AngularJS实现表单验证功能详解
2017/10/12 Javascript
利用Javascript获取选择文本所在的句子详解
2017/12/03 Javascript
如何使node也支持从url加载一个module详解
2018/06/05 Javascript
JavaScript创建对象的四种常用模式实例分析
2019/01/11 Javascript
[01:04:20]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.29
2020/12/02 DOTA
[01:08:24]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第一场 2月5日
2021/03/11 DOTA
Django学习笔记之ORM基础教程
2018/03/27 Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
2019/09/05 Python
Python numpy大矩阵运算内存不足如何解决
2020/11/19 Python
CSS实现聊天气泡效果
2020/04/26 HTML / CSS
享誉全球的多元化时尚精品购物平台:Farfetch发发奇(支持中文)
2017/08/08 全球购物
自荐信结尾
2013/10/27 职场文书
群众路线剖析材料
2014/02/02 职场文书
2014四风问题对照检查材料范文
2014/09/15 职场文书
2014年服务员个人工作总结
2014/12/23 职场文书
2015年医院药剂科工作总结
2015/05/04 职场文书
社区服务理念口号
2015/12/25 职场文书
成本低的5个创业项目:投资小、赚钱快
2019/08/20 职场文书
win11无线投屏在哪设置? win11无线投屏功能的使用方法
2022/04/08 数码科技