Python中logging模块的基本用法
本文首发于:行者AI
在开发项目时,我们不可能将所有的信息都打印在控制台中。我们可以使用Python标准库提供的logging API来处理。相比print,logging模块提供了许多强大而灵活的功能。比如:可以通过设置不同的日志等级,只输出重要信息,而不必显示大量的调式信息;print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其他数据,而logging则可以由开发者决定将信息输出到什么地方,以及怎么输出。
1. logging模块基本信息
1.1 日志等级
logging函数默认定义了5个日志等级,它允许开发人员自定义日志等级,但是并不推荐。
日志等级(level)) | 描述 |
---|---|
DEBUG | 最详细的日志信息,典型应用场景是 问题诊断 |
INFO | 信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作 |
WARNING | 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的 |
ERROR | 由于一个更严重的问题导致某些功能不能正常运行时记录的信息 |
CRITICAL | 当发生严重错误,导致应用程序不能继续运行时记录的信息 |
注:日志等级从上到下依次升高 DEBUG < INFO < WARNING < ERROR < CRITICAL,而日志信息依次减少;当指定一个日志级别之后,会记录大于或等于这个日志级别的日志信息,小于的将会被丢弃;默认打印的日志等级是 WARNING ,当日志等级设置为 WARNING 或之上时才被跟踪。
1.2 日志字段信与格式
一条日志信息对应的是一个事件的发生,而一个事件通常需要包括以下几个内容:
- 事件发生时间
- 事件发生位置
- 事件的严重程度
- 日志级别、事件内容等其他内容
注:输出一条日志时,日志内容和日志级别是需要开发人员明确指定的;对于而其它字段信息,只需要是否显示在日志中就可以了。
2. logging模块的使用方式
2.1 两种记录日志方式
(1)使用logging提供的模块级别函数
(2)使用logging日志系统的四大组件
2.2 使用logging提供的模块级别函数详细说明
(1)函数描述:
函数 | 描述 |
---|---|
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(level, args, *kwargs) | 创建一条严重级别为level的日志记录 |
logging.basicConfig(**kwargs) | 对root logger进行一次性配置 |
注:其中logging.basicConfig(**kwargs)函数用于指定“要记录的日志级别”、“日志格式”、 “日志输出位置”、“日志文件的打开模式”等信息,其他几个都是用于记录各个级别日志的函数。
(2)实例:
import logging
def ex_logging():logging.debug("日志级别:DEBUG")logging.info("日志级别:INFO")logging.warning("日志级别:WARNING")logging.error("日志级别:ERROR")logging.critical("日志级别:CRITICAL")
ex_logging()
(3)实际结果:
WARNING:root:日志级别:WARNING
ERROR:root:日志级别:ERROR
CRITICAL:root:日志级别:CRITICAL
注:默认打印的日志等级是 WARNING ,所以实际结果中只打印出了WARNING 或WARNING级别之上的日志。
2.3 使用logging日志系统的四大组件
组件描述:
组件名称 | 类名 | 描述 |
---|---|---|
日志器 | loggers | 提供应用程序代码直接使用的接口 |
处理器 | handlers | 用于将日志记录发送到指定的目的位置 |
过滤器 | filters | 提供更细粒度的日志过滤功能,用于决定哪些日志记录将会被输出(其他的日志记录将会被忽略) |
格式器 | formatters | 用于控制日志信息的最终输出格式 |
2.4 日志器 - Logger
(1)Logger是一个树形层级结构,在使用接口debug、info、warning、error、critical之前必须创建Logger实例;
(2)创建方式:
logger = logging.getLogger(logger_name)
(3)创建Logger实例后,可以使用以下方法进行日志级别设置,增加处理器Handler:
logger.setLevel(logging.ERROR) # 设置日志级别为 ERROR,即只有日志级别大于等于 ERROR 的日志才会输出
logger.addHandler(handler_name) # 为Logger实例增加一个处理器
logger.removeHandler(handler_name) # 为 Logger 实例删除一个处理器
2.5 处理器 - Handler
(1)Handler 处理器类型有很多种,比较常用的有三个:StreamHandler、FileHandler、NullHandler。
(2)创建方式:
# StreamHandler创建方式
sh = logging.StreamHandler(stream=None)
# FileHandler创建方式
# fh = logging.FileHandler(filename, mode='a', encoding=None, delay=False)
# NullHandler:NullHandler类位于核心logging包,不做任何的格式化或者输出。本质上它是个“什么都不做”的handler,由库开发者使用。
(3)创建 StreamHandler 之后,可以通过使用以下方法设置日志级别,设置格式化器 Formatter,增加或删除过滤器 Filter。
ch.setLevel(logging.WARN) # 指定日志级别,低于WARN级别的日志将被忽略
ch.setFormatter(formatter_name) # 设置一个格式化器formatter
ch.addFilter(filter_name) # 增加一个过滤器,可以增加多个
ch.removeFilter(filter_name) # 删除一个过滤器
2.6 过滤器 - filters
(1)Filter过滤器基类,它只允许某个logger层级下的日志事件通过过滤。
(2)一条日志信息被输出要经过以下几次过滤:日志器等级过滤、日志器的过滤器过滤、日志器的处理器等级过滤、日志器的处理器的过滤器过滤。
(3)创建方式:
filter = logging.Filter(name='')
2.7 格式化器 - Formatter
(1)使用Formatter对象设置日志信息最后的规则、结构和内容,默认的时间格式为%Y-%m-%d %H:%M:%S。
(2)创建方法:
formatter = logging.Formatter(fmt=None, datefmt=None)
# fmt是消息的格式化字符串,datefmt是日期字符串。如果不指明fmt,将使用'%(message)s'。如果不指明datefmt,将使用ISO8601日期格式。
2.8 组件之间的关系
(1)日志器(logger)需要通过处理器(handler)将日志信息输出到目标位置,不同的处理器(handler)可以将日志输出到不同的位置。
(2)日志器(logger)可以设置多个处理器(handler)将同一条日志记录输出到不同的位置。
(3)每个处理器(handler)都可以设置自己的过滤器(filter)实现日志过滤,从而只保留感兴趣的日志。
(4)每个处理器(handler)都可以设置自己的格式器(formatter)实现同一条日志以不同的格式输出到不同的地方。
总结以上内容:Logger 可以包含一个或多个 Handler 和 Filter,即:LoggerFilter,即:Logger 与 Handler 或 Fitler 是一对多的关系;一个 Logger 实例可以新增多个 Handler,一个 Handler 可以新增多个格式化器或多个过滤器,而且日志级别将会继承。
3. 代码的实现与具体应用
可以通过以下3种方法来配置logging:使用python代码创建loggers,handlers和formatters并分别调用它们的配置函数,创建一个日志配置文件,然后使用fileConfig()函数来读取该文件的内容,创建一个包含配置信息的dict,然后把它传递给dictConfig()函数;
3.1 使用python代码实现日志配置
(1)Python代码展示:
import logging
import sys
# 创建日志器logger并将其日志级别设置为DEBUG
logger = logging.getLogger("python_config_logger")
logger.setLevel(logging.DEBUG)
# 创建一个流处理器handler并将其日志级别设置为DEBUG
handler = logging.StreamHandler(sys.stdout)
handler.setLevel(logging.DEBUG)
# 创建一个格式化器formatter并将其添加到处理器handler中
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
# 为日志器logger添加上面创建好的处理器handler
logger.addHandler(handler)
# 将日志打印在控制台
logger.debug('打印日志级别:debug')
logger.info('打印日志级别:info')
logger.warning('打印日志级别:warning')
logger.error('打印日志级别:error')
logger.critical('打印日志级别:critical')
(2)实际结果:
2021-02-24 17:13:44,644 - python_config_logger - DEBUG - 打印日志级别:debug
2021-02-24 17:13:44,644 - python_config_logger - INFO - 打印日志级别:info
2021-02-24 17:13:44,644 - python_config_logger - WARNING - 打印日志级别:warning
2021-02-24 17:13:44,645 - python_config_logger - ERROR - 打印日志级别:error
2021-02-24 17:13:44,645 - python_config_logger - CRITICAL - 打印日志级别:critical
3.2 使用配置文件和fileConfig()函数实现日志配置
(1)Python代码展示:
import logging.config
# 读取日志配置文件内容
logging.config.fileConfig('logging.conf')
# 创建一个日志器logger
logger = logging.getLogger('simpleExample')
# 将日志打印在控制台
logger.debug('打印日志级别:debug')
logger.info('打印日志级别:info')
logger.warning('打印日志级别:warning')
logger.error('打印日志级别:error')
logger.critical('打印日志级别:critical')
(2)logging.conf配置文件内容:
[loggers]
keys=root,simpleExample
# 测试
[handlers]
keys=fileHandler,consoleHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=DEBUG
handlers=fileHandler
[logger_simpleExample]
level=DEBUG
handlers=consoleHandler
qualname=simpleExample
propagate=0
[handler_consoleHandler]
class=StreamHandler
args=(sys.stdout,)
level=DEBUG
formatter=simpleFormatter
[handler_fileHandler]
class=FileHandler
args=('logging.log', 'a')
level=ERROR
formatter=simpleFormatter
[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=
(3)实际结果:
2021-02-25 15:04:50,644 - simpleExample - DEBUG - 打印日志级别:debug
2021-02-25 15:04:50,646 - simpleExample - INFO - 打印日志级别:info
2021-02-25 15:04:50,646 - simpleExample - WARNING - 打印日志级别:warning
2021-02-25 15:04:50,646 - simpleExample - ERROR - 打印日志级别:error
2021-02-25 15:04:50,646 - simpleExample - CRITICAL - 打印日志级别:critical
3.3 使用dict配置信息和dictConfig()函数实现日志配置
(1)Python代码展示:
import logging.config
import logging
import yaml# 读取日志配置文件内容
with open('logging.yml', 'r') as file_logging:dict_conf = yaml.load(file_logging, Loader=yaml.FullLoader)
logging.config.dictConfig(dict_conf)
# 创建一个日志器logger
logger = logging.getLogger('simpleExample')
# 将日志打印在控制台
logger.debug('打印日志级别:debug')
logger.info('打印日志级别:info')
logger.warning('打印日志级别:warning')
logger.error('打印日志级别:error')
logger.critical('打印日志级别:critical')
(2)logging.yml配置文件内容:
version: 1
formatters:simple:format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
handlers:console:class: logging.StreamHandlerlevel: DEBUGformatter: simple
loggers:simpleExample:level: DEBUGhandlers: [console]propagate: no
root:level: DEBUGhandlers: [console]
(3)实际结果:
2021-02-25 15:14:28,822 - simpleExample - DEBUG - 打印日志级别:debug
2021-02-25 15:14:28,822 - simpleExample - INFO - 打印日志级别:info
2021-02-25 15:14:28,822 - simpleExample - WARNING - 打印日志级别:warning
2021-02-25 15:14:28,822 - simpleExample - ERROR - 打印日志级别:error
2021-02-25 15:14:28,823 - simpleExample - CRITICAL - 打印日志级别:critical
4. 总结
本文只是简单的介绍了python中logging模块的基本使用方法,后期还有许多优化的地方,希望和大家一起来探讨。
PS:更多技术干货,快关注【公众号 | xingzhe_ai】,与行者一起讨论吧!
Python中logging模块的基本用法相关推荐
- Python中pywifi模块的基本用法
跨平台的pywifi模块支持操作无线网卡,该模块易于使用,同时支持Windows.Linux等多个系统.pywifi模块不是Python的标准模块,需单独安装,同时该模块依赖comtypes模块,最 ...
- Python 中 Logging 模块使用详情
1.为什么要用logging模块 在实际应用中,日志文件十分重要,通过日志文件,我们知道程序运行的细节;同时,当程序出问题时,我们也可以通过日志快速定位问题所在.在我们写程序时,也可以借助 loggi ...
- python中logging模块的一些简单用法
用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么了,但是当我需要看大量的地方或者在一个文件中查看的时候,这时候print就不大方便了,所 ...
- python中log1p用法_python中logging模块的基本用法
1.logging模块可以跟踪代码的运行记录事件,log信息共内置了5个层级--调试(debug).信息(info).警告(warning).错误(error).严重错误(critical) 2.lo ...
- python中logging模块详解_python logging日志模块详解
logging 日志模块详解 用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么了,但是当我需要看大量的地方或者在一个文件中查看的时候,这 ...
- 学习Python中turtle模块的基本用法(5:绘制简笔画羊)
人已阳,准备画个喜羊羊纪念一下,但是喜羊羊头上的卷太多了,不太好画,于是找了参考文献1的普通的简笔画羊,使用Python中的turtle模块绘制(采用参考文献3中绘制云朵的代码绘制羊身体). ...
- 学习Python中turtle模块的基本用法(3:学习绘图示例源码)
基于前面学习的turtle模块基本函数,在GitHub及其它网站中找到部分turtle绘制图形的示例,本文选取部分案例,学习案例源码,分析绘图思路,以巩固turtle基本函数的用法. 绘制爱心 ...
- 学习Python中turtle模块的基本用法(6:其它函数)
除了之前文章中介绍的turtle模块的绘图函数,本文从turtle帮助文档中梳理了其它绘图或状态函数,编写复杂的绘图函数时也用得到,函数清单如下表所示: 序号 函数名称 说明 1 turtle.h ...
- Python中pyqtgraph模块结构及用法(1)
pyqtgraph官方文档 官方网站 pyqtgraph是一个纯python的图形和GUI库,基于PyQt4\PySide和Numpy 一. pyqtgraph绘图方式 方法 官方文档 描述 pyqt ...
最新文章
- html5面板制作代码,HTML5绘制设备面板
- android 在使用ViewAnimationUtils.createCircularReveal()无法兼容低版本的情况下,另行实现圆形scale动画...
- 遍历页面上所有的textBox
- c语言循环程序设计教案,10 《C语言程序设计》教案 第三章 程序的控制结构(6)—循环结构 while和do while.doc...
- Module 'matplotlib' has no 'contourf' member 使用Python导入matplotlib模块报错
- Web框架之Django_05 模型层了解(单表查询、多表查询、聚合查询、分组查询)
- BZOJ 2134: 单选错位
- python中test_在python中生成py.test测试
- 前端学习(1620):前端系列实战课程之提取行间样式
- SpringSecurity 流程图
- Java多线程学习总结(4)——ThreadPoolExecutor 线程池的拒绝策略学习总结
- OpenCV之鼠标操作
- 国际物流、快递、空运、海运、FBA头程、专线分别都有什么不同
- threejs道路贴图动画
- 怎么样把自己计算机两个硬盘合并,两个硬盘怎么合并成一个盘
- 中医针灸学综合练习题库【12】
- 交大研究生去日本签证攻略
- linux 去掉终端控制符,Linux终端显示控制字符
- 3.3 WSN路由协议
- HTMLParser 使用详解
热门文章
- 英雄纹章2 android,《童话萌消团》手游过关小技巧 游戏黑洞的福音
- 存在对其他服务器端口(TCP:8090)的攻击行为之我的服务器被黑了
- 02- OpenCV绘制图形及图像算术变换 (OpenCV系列) (机器视觉)
- 请选择正确html,以下HTML标签中有两个是成对标签( )。[请选择2个正确答案]
- 戴尔页面计算机怎么创建快捷方式,Dell笔记本电脑怎么Fn功能快捷键?
- 201900 TP-LINK WR700N V3 tplink无线路由器的那些事
- java until,Java ChronoLocalDateTime until()用法及代码示例
- 获取android的拍照和自定义多选相册
- 魅蓝metal android底层,魅族魅蓝3S和魅蓝metal哪个好
- 计算机毕设音乐网站系统,计算机毕业设计之JavaWeb个性化音乐推荐系统 音乐网站...