常用模块 - logging模块
一、简介
logging模块定义的函数和类为应用程序和库的开发实现了一个灵活的事件日志系统。logging模块是Python的一个标准库模块,由标准库模块提供日志记录API的关键好处是所有Python模块都可以使用这个日志记录功能。所以,你的应用日志可以将你自己的日志信息与来自第三方模块的信息整合起来。
二、logging模块的日志级别
logging模块默认定义了以下几个日志等级,它允许开发人员自定义其他日志级别,但是这是不被推荐的,尤其是在开发供别人使用的库时,因为这会日志级别的混乱。
日志等级 |
描述 |
DEBUG |
最详细的日志信息,典型应用场景是问题诊断 |
INFO |
信息详细程序仅次于DEBUG,通常只记录关键节点信息,用于确认一切都按照我们预期的那样进行工作 |
WARNING |
当某些不期望的事情发生时记录的信息(如磁盘可用空间较低),但是此时应用程序还是正常运行的 |
ERROR |
由于一个更严重的问题导致某些功能不能正常运行时记录的信息 |
CRITICAL |
当发生严重错误,导致应用程序不能继续运行时记录的信息 |
开发应用程序或部署开发环境时,可以使用DEBUG或INFO级别的日志获取尽可能详细的日志信息来进行开发或部署调试;应用上线或部署生产环境时,应用使用WARNING或ERROR或CRITICAL级别的日志来降低机器的I/O压力和提高获取错误日志信息的效率。日志级别的指定通常都是在应用程序的配置文件中进行指定的。
说明: ·上面列表中的日志等级是从上到下依次升高的,即:DEBUG<INFO<WARNING<ERROR<CRITICAL,而日志的信息量是依次减少的; ·当为某个应用程序指定一个日志级别后,应用程序会记录所有日志级别大于或等于指定日志级别的日志信息,而不是仅仅记录指定级别的日志信息,nginx、php等应用程序以及这里要提高的python的logging模块都是这样的。同样,logging模块也可以指定日志记录器的日志级别,只有级别大于或等于该指定日志级别的日志记录才会被输出,小于该等级的日志记录将会被丢弃。 |
三、logging模块的使用方式介绍
logging模块提供了两种记录日志的方式:
·第一种方式是使用logging提供的模块级别的函数
·第二种方式是使用logging日志系统的四大组件
其实,logging所提供的模块级别的日志记录函数也是对logging日志系统相关类的封装而已。
logging模块定义的模块级别的常用函数:
函数 |
说明 |
logging.debug(msg, *args, **kwargs) |
创建一条严重级别为DEBUG的日志记录 |
logging.info(msg, *args, **kwargs) |
创建一条严重级别为INFO的日志记录 |
logging.warning(msg, *args, **kwargs) |
创建一条严重级别为WARNING的日志记录 |
logging.error(msg, *args, **kwargs) |
创建一条严重级别为ERROR的日志记录 |
logging.critical(msg, *args, **kwargs) |
创建一条严重级别为CRITICAL的日志记录 |
logging.log(msg, *args, **kwargs) |
创建一条严重级别为level的日志记录 |
logging.basicConfig(msg, *args, **kwargs) |
对root logger进行一次性配置 |
其中logging.basicConfig(msg, *args, **kwargs)函数用于指定“要记录的日志级别”、“日志格式”、“日志输出位置”、“日志文件的打开模式”等信息,其他几个都是用于记录各个级别日志的函数。
logging模块的四大组件:
组件 |
说明 |
loggers |
提供应用程序代码直接使用的接口 |
handlers |
用于将日志记录发送到指定的目的位置 |
filters |
提供更细粒度的日志过滤功能,用于决定哪些日志记录将会被输出(其它的日志记录将会被忽略) |
formatters |
用于控制日志信息的最终输出格式 |
说明:logging模块提供的模块级别的那些函数实际上也是通过这几个组件的相关实现类来记录日志的,只是在创建这些类的实例时设置了一些默认值。 |
四、使用logging模块提供的模块级别函数记录日志
回顾一下前面提到的几个重要信息:
·可以通过logging模块定义的模块级别的方法去完成简单的日志记录
·只有级别大于或等于日志记录器指定级别的日志记录才会被输出,小于该级别的日志记录将会被丢弃。
1、最简单的日志输出
先来试着分别输出一条不同日志级别的日志记录:
import logging logging.debug("这是一条“debug”级别的日志信息!")
logging.info("这是一条“info”级别的日志信息!")
logging.warning("这是一条“warning”级别的日志信息!")
logging.error("这是一条“error”级别的日志信息!")
logging.critical("这是一条“critical”级别的日志信息!")
输出结果:
WARNING:root:这是一条“warning”级别的日志信息!
ERROR:root:这是一条“error”级别的日志信息!
CRITICAL:root:这是一条“critical”级别的日志信息!
2、那么问题来了
问题1:为什么前面两条日志信息没有被打印出来?
这是因为logging模块提供的日志记录函数所使用的日志器设置的默认级别是“WARNING”,因此只有“WARNING”级别的日志记录以及大于它的“ERROR”和“CRITICAL”级别的日志记录被输出了,而小球它的“DEBUG”和“INFO”级别的日志记录被丢弃了。
问题2:打印出来的日志信息中各字段表示什么意思?为什么会这样输出?
上面输出结果中每行记录的各个字段含义分别是:
日志级别:日志器名称:日志内容
之所以会这样输出,是因为logging模块提供的日志记录函数所使用的日志设置的日志格式默认是BASIC_FORMAT,其值为:
"%(levelname)s:%(name)s:%(message)s"
问题3:为什么日志记录是打印到控制台?
因为在logging模块提供的日志记录函数所使用的日志器设置的处理器所指定的日志输出位置默认为“sys.stderr”。
问题4:怎么修改这些默认设置?
在我们调用上面这些日志记录函数之前,手动调用一些basicConfig()方法,把我们想设置的内容以参数的形式传递进去就可以了。
3、logging.basicConfig()函数说明
该方法用于logging日志系统做一些基本配置,方法定义如下:
logging.basicConfig(**kwargs)
该函数可接收的关键字参数如下:
参数名称 |
描述 |
filename |
指定日志输出目标文件的文件名,指定该设置荐后日志将不会输出到控制台了 |
filemode |
指定日志文件的打开模式,默认为'a'。需要注意的是,该选项要在filename指定时才有效 |
format |
指定日志格式字符串,即指定日志输出时所包含的字段信息以及它们的顺序。logging模块定义的格式字段下面会列出 |
detefmt |
指定日期/时间格式。需要注意的是,该选项要在format中包含时间字段%(asctime)s时才有效 |
level |
指定日志器的日志级别 |
stream |
指定日志输出目录stream,如sys.stdout、sys.stderr以及网络stream。需要说明的是,stream和filename不能同时提供,否则会引发“ValueError”异常 |
sysle |
Python 3.2中新添加的配置项。指定format格式字符串的风格,可取值'%'、'{'和'$',默认为'%' |
handlers |
Python 3.2中新添加的配置项。该选项如果被指定,它应该是一个创建了多个Handler的可迭代对象,这些handler将会被添加到rootlogger。需要说明的是:filename、stream和handlers这三个配置项只能有一个存在,不能同时出现2个或3个,否则会引发“ValueError”异常 |
4、logging模块定义的格式字符串字段
我们来列举一下logging模块中定义好的可以用于format格式字符串中字段有哪些:
字段/属性名称 |
使用格式 |
描述 |
asctime |
%(asctime)s |
日志事件发生的时间,如:2019-04-02 10:49:45,896 |
created |
%(created)f |
日志事件发生的时间戳 |
relativeCreated |
%(relativeCreated)d |
日志事件发生的时间相对于logging模块加载时间的相对毫秒数 |
msecs |
%(msecs)d |
日志事件发生事件的毫秒部分 |
levelname |
%(levelname)s |
该日志记录的文字形式的日志级别(DEBUG、INFO、WARNING、ERROR、CRITICAL) |
levelno |
%(levelno)s |
该日志记录的数字形式的日志级别(10、20、30、40、50) |
name |
%(name)s |
所使用的日志器名称,默认是“root”,因为默认使用的是rootLogger |
message |
%(message)s |
日志记录的文本内容 |
pathname |
%(pathname)s |
调用日志记录函数的源码文件的全路径 |
filename |
%(filename)s |
pathname的文件名部分,包含文件后缀 |
module |
%(module)s |
filename的名称部分,不包含文件后缀 |
lineno |
%(lineno)d |
调用日志记录函数的源代码所在的行号 |
funcName |
%(funcName)s |
调用日志记录函数的源代码所在的行号 |
process |
%(process)d |
进程ID |
processName |
%(processName)s |
进程名称 |
thread |
%(thread)s |
线程ID |
threadName |
%(threadName)s |
线程名称 |
5、经过配置的日志输出
先简单配置下日志器的日志级别
import logging logging.basicConfig(
level=logging.DEBUG
) logging.debug("这是一条“debug”级别的日志信息!")
logging.info("这是一条“info”级别的日志信息!")
logging.warning("这是一条“warning”级别的日志信息!")
logging.error("这是一条“error”级别的日志信息!")
logging.critical("这是一条“critical”级别的日志信息!")
输出结果:
DEBUG:root:这是一条“debug”级别的日志信息!
INFO:root:这是一条“info”级别的日志信息!
WARNING:root:这是一条“warning”级别的日志信息!
ERROR:root:这是一条“error”级别的日志信息!
CRITICAL:root:这是一条“critical”级别的日志信息!
所有等级的日志信息都被输出了,说明配置生效了。
在配置日志器日志级别的基础上,配置下日志输出目标文件和日志格式
import logging log_format = "%(asctime)s - %(levelname)s - %(message)s" logging.basicConfig(
filename="log.log", level=logging.DEBUG, format=log_format
) logging.debug("这是一条“debug”级别的日志信息!")
logging.info("这是一条“info”级别的日志信息!")
logging.warning("这是一条“warning”级别的日志信息!")
logging.error("这是一条“error”级别的日志信息!")
logging.critical("这是一条“critical”级别的日志信息!")
此时会发现控制台中已经没有输出日志内容,但是在python代码文件的相同目录下会生成一个名为“log.log”的日志文件,该文件中的内容为:
2019-04-02 13:58:54,708 - DEBUG - 这是一条“debug”级别的日志信息!
2019-04-02 13:58:54,737 - INFO - 这是一条“info”级别的日志信息!
2019-04-02 13:58:54,737 - WARNING - 这是一条“warning”级别的日志信息!
2019-04-02 13:58:54,737 - ERROR - 这是一条“error”级别的日志信息!
2019-04-02 13:58:54,737 - CRITICAL - 这是一条“critical”级别的日志信息!
在上面的基础上,我们再来设置下日期/时间格式
import logging log_format = "%(asctime)s - %(levelname)s - %(message)s"
date_format = "%m/%d/%Y %H:%M:%S %p"
logging.basicConfig(
filename="log.log", level=logging.DEBUG, format=log_format, datefmt=date_format
) logging.debug("这是一条“debug”级别的日志信息!")
logging.info("这是一条“info”级别的日志信息!")
logging.warning("这是一条“warning”级别的日志信息!")
logging.error("这是一条“error”级别的日志信息!")
logging.critical("这是一条“critical”级别的日志信息!")
此时会在“log.log”日志文件中看到如下输出内容:
04/02/2019 14:03:46 PM - DEBUG - 这是一条“debug”级别的日志信息!
04/02/2019 14:03:46 PM - INFO - 这是一条“info”级别的日志信息!
04/02/2019 14:03:46 PM - WARNING - 这是一条“warning”级别的日志信息!
04/02/2019 14:03:46 PM - ERROR - 这是一条“error”级别的日志信息!
04/02/2019 14:03:46 PM - CRITICAL - 这是一条“critical”级别的日志信息!
掌握了上面的内容之后,已经能够满足我们平时开发中需要的日志记录功能。
常用模块 - logging模块的更多相关文章
- os模块 sys模块 json/pickle 模块 logging模块
目录 模块 1. os模块 2. sys模块 3. json和pickle模块 4. logging模块 (1)日志配置 (2)实际开发中日志的使用 模块 1. os模块 os模块有什么用 与操作系统 ...
- os模块/sys模块/json/pickle模块/logging模块(day16整理)
目录 今日内容 os模块 对文件操作 对文件夹此操作 辅助性的 了解 sys模块 json和pickle模块 json模块 pickle模块 logging模块 日志级别 添加设置 自定义配置 今日内 ...
- Python全栈之路----常用模块----logging模块
很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,loggin ...
- 常用模块(collections模块,时间模块,random模块,os模块,sys模块,序列化模块,re模块,hashlib模块,configparser模块,logging模块)
认识模块 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写的 ...
- Python模块——logging模块
logging模块简介 logging模块定义的函数和类为应用程序和库的开发实现了一个灵活的事件日志系统.logging模块是Python的一个标准库模块, 由标准库模块提供日志记录API的关键好处是 ...
- hashlib模块configparser模块logging模块
hashlib模块 算法介绍 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长 ...
- shelve模块,sys模块,logging模块
1.shelve模块 用于序列化的模块,shelve模块比pickle模块简单,只有open函数,返回类似字典的对象,可读可写;key必须为字符串,而值可以是python所支持的数据类型. impor ...
- python模块: hashlib模块, configparse模块, logging模块,collections模块
一. hashlib模块 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用 ...
- Python10/17-re模块/hashlib模块/logging模块
import logging # 1.日志的级别# logging.debug("这是一个调试信息") # 10# logging.info("常规信息") # ...
随机推荐
- HDU6223 && 2017沈阳ICPC: G. Infinite Fraction Path——特殊图&&暴力
题意 给定一个数字串,每个位子都能向(i*i+1)%n的位子转移,输出在路径上.字典序最大的.长度为n的串($n \leq 150000$). 分析 先考虑一个暴力的方法,考虑暴力每个x,然后O(n) ...
- 【java异常】Building workspace has encountered a problem. Error
可能是workspace设置错误,检查一下 或者把项目重新下一下,或者重新maven导入
- Pandas | 20 级联
Pandas提供了各种工具(功能),可以轻松地将Series,DataFrame和Panel对象组合在一起. pd.concat(objs,axis=0,join='outer',join_axes= ...
- 几个golang 静态资源嵌入包
静态资源嵌入二进制文件中,可以方便我们的软件分发(只需要简单的二进制文件就可以了),目前大部分golang 的 web 应用都是使用类似的方法. 以下是收集到的一些常见方案 github.com/go ...
- 凤翔中学高三数学[备课&作业]
#tab{ font-size:22px ;font-family:楷体;text-align:center;} a:link { text-decoration: none;} 凤中2020届高三文 ...
- 决策单调性优化dp 专题练习
决策单调性优化dp 专题练习 优化方法总结 一.斜率优化 对于形如 \(dp[i]=dp[j]+(i-j)*(i-j)\)类型的转移方程,维护一个上凸包或者下凸包,找到切点快速求解 技法: 1.单调队 ...
- SQL数据同步到ELK(四)- 利用SQL SERVER Track Data相关功能同步数据(上)
一.相关文档 老规矩,为了避免我的解释误导大家,请大家务必通过官网了解一波SQL SERVER的相关功能. 文档地址: 整体介绍文档:https://docs.microsoft.com/en-us/ ...
- 【操作系统之七】Linux常用命令之tail
一.概念linux tail命令用途是按照要求将指定的文件的最后部分输出到标准设备,一般是终端,就是把某个档案文件的最后几行显示到终端上,如果该档案有更新,tail会自动刷新,确保你看到最新的档案内容 ...
- 【Activiti学习之六】BPMN任务
环境 JDK 1.8 MySQL 5.6 Tomcat 7 Eclipse-Luna activiti 6.0 一.任务任务表示流程中将要完成的工作. 1.任务继承 2.任务类型Service Tas ...
- 【神经网络与深度学习】生成式对抗网络GAN研究进展(五)——Deep Convolutional Generative Adversarial Nerworks,DCGAN
[前言] 本文首先介绍生成式模型,然后着重梳理生成式模型(Generative Models)中生成对抗网络(Generative Adversarial Network)的研究与发展.作者 ...