前言:我们之前运行代码时都是将日志直接输出到控制台,而实际项目中常常需要把日志存储到文件,便于查阅,如运行时间、描述信息以及错误或者异常发生时候的特定上下文信息。
logging模块介绍
Python中自带的logging模块提供了标准的日志接口,在debug时使用往往会事半功倍。为什么不直接使用print去输出呢?这种方式对简单的脚本来说有用,对于复杂的系统来说相当于一个花瓶摆设,大量的print输出很容易被遗忘在代码里,并且print是标准输出,这很难从一堆信息里去判断哪些是你需要重点关注的。
logging的优势就在于可以控制日志的级别,把不需要的信息进行过滤,且可以决定它输出到什么地方、如何输出,还可以通过控制等级把特定等级的信息输出到特定的位置等。logging一共分为四个部分:
- :blue_book: Loggers:日志收集器,可供程序直接调用的接口,app通过调用提供的api来记录日志
- :notebook_with_decorative_cover: Handlers:日志处理器, 决定将日志记录分配至正确的目的地
- :orange_book: Filters:日志过滤器,对日志信息进行过滤, 提供更细粒度的日志是否输出的判断
- :ledger: Formatters:日志格式器,制定最终记录打印的格式布局
日志等级
logging将logger的等级划分成5个level,由低到高分别是DEBUG、INFO、WARNING、ERROE、CRITICAL,默认是WARNING级别,CRITICAL最高,相关等级说明如下:
Level说明DEBUG输出详细的运行信息,主要用于调试,追踪问题时使用INFO输出正常的运行的信息,一切按预期进行的情况WARNING一些意想不到的或即将会发生的情况,比如警告:内存空间不足,但不影响程序运行ERROR由于某些问题,程序的一些功能会受到影响,还可以继续运行CRITICAL一个严重的错误,表明程序本身可能无法继续运行
这些等级的日志中低包含高,比如INFO,会收集INFO及以上等级的日志,DEBUG等级的日志将不进行收集。下面我们来输出这5个等级的日志:
import logging """ logging模块默认收集的日志是warning以上等级的 """ a = 100 logging.debug(a) logging.info('这是INFO等级的信息') logging.warning('这是WARNING等级的信息') logging.error('这是ERROR等级的信息') logging.critical('这是CRITICAL等级的信息')
输出结果:
C:\software\python\python.exe D:/learn/test.py WARNING:root:这是WARNING等级的信息 ERROR:root:这是ERROR等级的信息 CRITICAL:root:这是CRITICAL等级的信息 Process finished with exit code 0
日志收集器
日志是怎么被收集和输出的呢?答案就是日志收集器,设置一个收集器,把指等级的日志信息输出到指定的地方,控制台或文件等,其工作过程大致如下:
logging中默认的日志收集器是root,收集等级默认是WARNING,我们可以通过setLevel来改变它的收集等级。
# 获取默认的日志收集器root my_log = logging.getLogger() # 设置默认的日志收集器等级 my_log.setLevel("DEBUG") # 日志将全部被收集 a = 100 logging.debug(a) logging.info('这是INFO等级的信息') logging.warning('这是WARNING等级的信息') logging.error('这是E