python 日志模块logging的使用场景及示例


Posted in Python onJanuary 04, 2021

前言

日志是对于软件执行所发生的事件的一种追踪记录方式。日常使用过程中对代码执行的错误和问题会进行查看日志来分析定位问题所在。平常编写代码以及调试也经常用到。通常的新手的做法是直接print打印,但是打印的结果只在控制台显示。今天我们学习一种高级的日志打印和记录模块logging。

logging提供了一系列的函数,它们是debug(), info(), warning(), error(), 和critical()。

他们的使用场景请看下表

你想要执行的任务 此任务的最好的工具
对于命令行或程序的应用,结果显示在控制台。 print()
在对程序的普通操作发生时提交事件报告(比如:状态监控和错误调查) logging.info() 函数(当有诊断目的需要详细输出信息时使用 logging.debug() 函数)
提出一个警告信息基于一个特殊的运行时事件 warnings.warn()位于代码库中,该事件是可以避免的,需要修改客户端应用以消除告警logging.warning() 不需要修改客户端应用,但是该事件还是需要引起关注
对一个特殊的运行时事件报告错误 引发异常
报告错误而不引发异常(如在长时间运行中的服务端进程的错误处理) logging.error(), logging.exception() 或 logging.critical()分别适用于特定的错误及应用领域

日志功能分别对各种事件和严重性都进行分级。

名称 何时使用 等级
DEBUG 细节信息,仅当诊断问题时适用。 10
INFO 确认程序按预期运行 20
WARNING 表明有已经或即将发生的意外(例如:磁盘空间不足)。程序仍按预期进行 30
ERROR 由于严重的问题,程序的某些功能已经不能正常执行 40
CRITICAL 严重的错误,表明程序已不能继续执行 50

示例

简单示例

因为是python自带的所以无需安装,默认的级别是WARNING,所以下面只显示一条warning信息。

import logging
logging.warning('this is warning')
logging.info('this is info')

python 日志模块logging的使用场景及示例

更改级别

我们将默认的级别改成最低级别,则会打印同级别以及高级别的日志信息

import logging 
logging.basicConfig(level=logging.DEBUG)
logging.debug('this is debug')
logging.info('this is info')
logging.warning('this is warning')
logging.error('this is error')

python 日志模块logging的使用场景及示例

保存日志

只是打印到控制台对于少量信息倒是可控,但是信息量大的时候就不方便查找了。那么我们需要将其保存到文件中。

import logging 
logging.basicConfig(level=logging.DEBUG,filename='log.log',format='%(asctime)s - %(lineno)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
logger.debug('this is debug')
logger.info('this is info')
logger.warning('this is warning')
logger.error('this is error')

python 日志模块logging的使用场景及示例

上面我们在保存的时候,同时还添加了其他描述信息,比如执行时间,执行代码行数,日志级别,打印消息。当然方法远不止这些,具体请看下表

属性名称 格式 描述
ARGS 你不需要自己设置格式。 参数元组被合并到msg中以产生消息,或者其值被用于合并的词典(当只有一个参数时,它是一个字典)。
asctime %(asctime)类 创建时的可读时间。默认情况下,这是'2003-07-08 16:49:45,896'的格式(逗号之后的数字是毫秒部分)。
created %(created)的F 创建的时间(由time.time()返回)。
exc_info 你不需要自己设置格式。 异常元组(àla sys.exc_info)或,如果没有发生异常,则为无。
filename %(filename)类 路径名的文件名部分。
funcName %(funcName)类 包含日志记录调用的函数的名称。
levelname %(levelname)■ 文本消息级别('DEBUG','INFO','WARNING','ERROR','CRITICAL')。
levelno %(levelno)s 消息的数字记录级别(DEBUG,INFO,WARNING,ERROR,CRITICAL)。
lineno %(lineno)d 发出日志记录调用的源行号。
module %(module)类 模块(文件名称部分)。
msecs %(msecs)d 创建时的毫秒部分。
message %(message)类 记录的消息,计算为msg%args。这是在调用Formatter.format()时设置的。
msg 你不需要自己设置格式。 在原始日志记录调用中传递的格式字符串。与args合并生成消息或任意对象(请参阅使用任意对象作为消息)。
name %(name)类 用于记录呼叫的记录器的名称。
pathname %(filename)类 发出日志记录调用的源文件的完整路径名。
process %(process)d 进程ID。
processName %(processName)类 进程名称。
relativeCreated %(relativeCreated)d 相对于加载日志记录模块的时间,LogRecord创建时的时间(以毫秒为单位)。
thread %(thread)d 线程ID。
threadName %(threadName)类 线程名称。

日志输出进阶

首先了解以下进阶的方法的说明:

StreamHandler 类位于核心 logging 包,它可将日志记录输出发送到数据流例如 sys.stdout, sys.stderr 或任何文件类对象(或者更精确地说,任何支持 write() 和 flush() 方法的对象

FileHandler 类位于核心 logging 包,它可将日志记录输出到磁盘文件中。 它从 StreamHandler 继承了输出功能。

我们需要通过调用 Logger 类(以下称为 loggers , 记录器)的实例来执行日志记录。

Logger 对象有三个常见的方法:

  • Logger.setLevel() 指定记录器将处理的最低严重性日志消息,其中 debug 是最低内置严重性级别, critical 是最高内置严重性级别。 例如,如果严重性级别为 INFO ,则记录器将仅处理 INFO 、 WARNING 、 ERROR 和 CRITICAL 消息,并将忽略 DEBUG 消息。
  • Logger.addHandler() 和 Logger.removeHandler() 从记录器对象中添加和删除处理程序对象。处理程序在以下内容中有更详细的介绍 处理程序 。
  • Logger.addFilter() 和 Logger.removeFilter() 可以添加或移除记录器对象中的过滤器。 Filter 对象 包含更多的过滤器细节。

下面示例采用添加日志记录器对象输出和上面一样在控制台打印

import logging
 
logger = logging.getLogger(__name__)
logger.setLevel(level=logging.INFO)
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(lineno)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
 
logger.info('This is a log info')
logger.debug('Debugging')
logger.warning('Warning exists')
logger.info('Finish')

python 日志模块logging的使用场景及示例

当然也同样能保存到文件,为了演示修改了文件名称为put.log

import logging
 
logger = logging.getLogger(__name__)
logger.setLevel(level=logging.INFO)
handler = logging.FileHandler('put.log')
formatter = logging.Formatter('%(asctime)s - %(lineno)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
 
 
logger.info('This is a log info')
logger.debug('Debugging')
logger.warning('Warning exists')
logger.info('Finish')

python 日志模块logging的使用场景及示例

日志双向输出

import logging

logger = logging.getLogger(__name__)
logger.setLevel(level=logging.INFO)
handler1 = logging.FileHandler('output.log')
handler2 = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(lineno)s - %(levelname)s - %(message)s')
handler1.setFormatter(formatter)
handler2.setFormatter(formatter)
logger.addHandler(handler1)
logger.addHandler(handler2)

logger.info('This is a log info')
logger.debug('Debugging')
logger.warning('Warning exists')
logger.info('Finish')

python 日志模块logging的使用场景及示例

python 日志模块logging的使用场景及示例

以上就是python 日志模块logging的使用场景及示例的详细内容,更多关于python 日志模块logging的使用的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python遍历指定文件及文件夹的方法
May 09 Python
彻底理解Python list切片原理
Oct 27 Python
Python爬虫包BeautifulSoup学习实例(五)
Jun 17 Python
Python3 itchat实现微信定时发送群消息的实例代码
Jul 12 Python
python实现简单聊天室功能 可以私聊
Jul 12 Python
Flask使用Pyecharts在单个页面展示多个图表的方法
Aug 05 Python
Python制作词云图代码实例
Sep 09 Python
django haystack实现全文检索的示例代码
Jun 24 Python
PyCharm vs VSCode,作为python开发者,你更倾向哪种IDE呢?
Aug 17 Python
Python字符串三种格式化输出
Sep 17 Python
python基于turtle绘制几何图形
Jun 15 Python
python运行脚本文件的三种方法实例
Jun 25 Python
python 邮件检测工具mmpi的使用
Jan 04 #Python
Python3中的tuple函数知识点讲解
Jan 03 #Python
python中pivot()函数基础知识点
Jan 03 #Python
python regex库实例用法总结
Jan 03 #Python
Python爬虫之Selenium库的使用方法
Jan 03 #Python
学会迭代器设计模式,帮你大幅提升python性能
Jan 03 #Python
Python编写万花尺图案实例
Jan 03 #Python
You might like
当海贼王变成JOJO风
2020/03/02 日漫
深入理解用mysql_fetch_row()以数组的形式返回查询结果
2013/06/05 PHP
PHP实现模仿socket请求返回页面的方法
2014/11/04 PHP
thinkphp3.2中实现phpexcel导出带生成图片示例
2017/02/14 PHP
修改js Calendar日历控件 兼容IE9/谷歌/火狐
2013/01/04 Javascript
javascript打印html内容功能的方法示例
2013/11/28 Javascript
JQuery的Ajax请求实现局部刷新的简单实例
2014/02/11 Javascript
javascript中的nextSibling使用陷(da)阱(keng)
2014/05/05 Javascript
jQuery源码分析之jQuery中的循环技巧详解
2014/09/06 Javascript
基于JavaScript实现鼠标悬浮弹出跟随鼠标移动的带箭头的信息层
2016/01/18 Javascript
javascript原型继承工作原理和实例详解
2016/04/07 Javascript
javaScript数组迭代方法详解
2016/04/14 Javascript
JavaScript中关于for循环删除数组元素内容时出现的问题
2016/11/21 Javascript
微信小程序 本地存储及登录页面处理实例详解
2017/01/11 Javascript
JavaScript限制在客户区可见范围的拖拽(解决scrollLeft和scrollTop的问题)(2)
2017/05/17 Javascript
js中的事件委托或是事件代理使用详解
2017/06/23 Javascript
nodeJS微信分享
2017/12/20 NodeJs
Vue多种方法实现表头和首列固定的示例代码
2018/02/02 Javascript
图文介绍Vue父组件向子组件传值
2018/02/17 Javascript
浅谈webpack4.x 入门(一篇足矣)
2018/09/05 Javascript
[04:11]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/01/30 DOTA
[04:10]2016国际邀请赛中国区预选赛第二日TOP10精彩集锦
2016/06/28 DOTA
举例讲解Python面相对象编程中对象的属性与类的方法
2016/01/19 Python
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
2016/05/27 Python
python flask 多对多表查询功能
2017/06/25 Python
python groupby 函数 as_index详解
2019/12/16 Python
基于Pytorch版yolov5的滑块验证码破解思路详解
2021/02/25 Python
人力资源部培训专员岗位职责
2014/01/02 职场文书
房地产开盘策划方案
2014/02/10 职场文书
学校党委副书记个人对照检查材料思想汇报
2014/09/28 职场文书
庆七一宣传标语
2014/10/08 职场文书
毕业论文答辩开场白
2015/05/27 职场文书
2015教师个人年度工作总结
2015/10/23 职场文书
python 如何获取页面所有a标签下href的值
2021/05/06 Python
css display table 自适应高度、宽度问题的解决
2021/05/07 HTML / CSS
如何搭建 MySQL 高可用高性能集群
2021/06/21 MySQL