本文首发于:行者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模块的基本用法相关推荐

  1. Python中pywifi模块的基本用法

     跨平台的pywifi模块支持操作无线网卡,该模块易于使用,同时支持Windows.Linux等多个系统.pywifi模块不是Python的标准模块,需单独安装,同时该模块依赖comtypes模块,最 ...

  2. Python 中 Logging 模块使用详情

    1.为什么要用logging模块 在实际应用中,日志文件十分重要,通过日志文件,我们知道程序运行的细节;同时,当程序出问题时,我们也可以通过日志快速定位问题所在.在我们写程序时,也可以借助 loggi ...

  3. python中logging模块的一些简单用法

    用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么了,但是当我需要看大量的地方或者在一个文件中查看的时候,这时候print就不大方便了,所 ...

  4. python中log1p用法_python中logging模块的基本用法

    1.logging模块可以跟踪代码的运行记录事件,log信息共内置了5个层级--调试(debug).信息(info).警告(warning).错误(error).严重错误(critical) 2.lo ...

  5. python中logging模块详解_python logging日志模块详解

    logging 日志模块详解 用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么了,但是当我需要看大量的地方或者在一个文件中查看的时候,这 ...

  6. 学习Python中turtle模块的基本用法(5:绘制简笔画羊)

      人已阳,准备画个喜羊羊纪念一下,但是喜羊羊头上的卷太多了,不太好画,于是找了参考文献1的普通的简笔画羊,使用Python中的turtle模块绘制(采用参考文献3中绘制云朵的代码绘制羊身体).    ...

  7. 学习Python中turtle模块的基本用法(3:学习绘图示例源码)

      基于前面学习的turtle模块基本函数,在GitHub及其它网站中找到部分turtle绘制图形的示例,本文选取部分案例,学习案例源码,分析绘图思路,以巩固turtle基本函数的用法. 绘制爱心   ...

  8. 学习Python中turtle模块的基本用法(6:其它函数)

      除了之前文章中介绍的turtle模块的绘图函数,本文从turtle帮助文档中梳理了其它绘图或状态函数,编写复杂的绘图函数时也用得到,函数清单如下表所示: 序号 函数名称 说明 1 turtle.h ...

  9. Python中pyqtgraph模块结构及用法(1)

    pyqtgraph官方文档 官方网站 pyqtgraph是一个纯python的图形和GUI库,基于PyQt4\PySide和Numpy 一. pyqtgraph绘图方式 方法 官方文档 描述 pyqt ...

最新文章

  1. html5面板制作代码,HTML5绘制设备面板
  2. android 在使用ViewAnimationUtils.createCircularReveal()无法兼容低版本的情况下,另行实现圆形scale动画...
  3. 遍历页面上所有的textBox
  4. c语言循环程序设计教案,10 《C语言程序设计》教案 第三章 程序的控制结构(6)—循环结构 while和do while.doc...
  5. Module 'matplotlib' has no 'contourf' member 使用Python导入matplotlib模块报错
  6. Web框架之Django_05 模型层了解(单表查询、多表查询、聚合查询、分组查询)
  7. BZOJ 2134: 单选错位
  8. python中test_在python中生成py.test测试
  9. 前端学习(1620):前端系列实战课程之提取行间样式
  10. SpringSecurity 流程图
  11. Java多线程学习总结(4)——ThreadPoolExecutor 线程池的拒绝策略学习总结
  12. OpenCV之鼠标操作
  13. 国际物流、快递、空运、海运、FBA头程、专线分别都有什么不同
  14. threejs道路贴图动画
  15. 怎么样把自己计算机两个硬盘合并,两个硬盘怎么合并成一个盘
  16. 中医针灸学综合练习题库【12】
  17. 交大研究生去日本签证攻略
  18. linux 去掉终端控制符,Linux终端显示控制字符
  19. 3.3 WSN路由协议
  20. HTMLParser 使用详解

热门文章

  1. 英雄纹章2 android,《童话萌消团》手游过关小技巧 游戏黑洞的福音
  2. 存在对其他服务器端口(TCP:8090)的攻击行为之我的服务器被黑了
  3. 02- OpenCV绘制图形及图像算术变换 (OpenCV系列) (机器视觉)
  4. 请选择正确html,以下HTML标签中有两个是成对标签( )。[请选择2个正确答案]
  5. 戴尔页面计算机怎么创建快捷方式,Dell笔记本电脑怎么Fn功能快捷键?
  6. 201900 TP-LINK WR700N V3 tplink无线路由器的那些事
  7. java until,Java ChronoLocalDateTime until()用法及代码示例
  8. 获取android的拍照和自定义多选相册
  9. 魅蓝metal android底层,魅族魅蓝3S和魅蓝metal哪个好
  10. 计算机毕设音乐网站系统,计算机毕业设计之JavaWeb个性化音乐推荐系统 音乐网站...