logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志输出格式等。
1.logging日志级别
下表是logging库的五个级别:
日志等级(level) |
描述 |
DEBUG |
最详细的日志信息,典型应用场景是 问题诊断 |
INFO |
信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确 认一切都是按照我们预期的那样进行工作 |
WARNING |
信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确 认一切都是按照我们预期的那样进行工作 |
ERROR |
信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确 认一切都是按照我们预期的那样进行工作 |
CRITICAL |
当发生严重错误,导致应用程序不能继续运行时记录的信息 |
1.1 调整日志输出级别
logging.basicConfig(filename, filemode, level) # level:设置的输出等级,共五种(与表格一致),指定形式如logging.DEBUG # filename: 设置日志的输出文件,如"test.log"。如果不指定,默认输出到控制台 # filemote: 输出到文件的模式,与open函数一致,如"w"先清空后写入,"a"附加
1.2 创建指定级别的日志
函数 |
说明 |
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的日志记录 |
1.3 实例1
import logging # logging.basicConfig(filename="demo.log", filemode='w', level=logging.DEBUG) logging.debug("this is debug") logging.info("this is info") logging.warning("this is warning") logging.error("this is error") logging.critical("this is critical")
结果如下
我们可以看到,我们创建了5条日志,但是只输出了三条。**原因是我们默认的日志输出等级为WARNING,优先级低于这个的不会输出。**此时,指定输出等级就有作用了。
1.4 实例2
import logging logging.basicConfig(filename="demo.log", filemode='w', level=logging.DEBUG) logging.debug("this is debug") logging.info("this is info") logging.warning("this is warning") logging.error("this is error") logging.critical("this is critical")
1.5 改变公共信息
从上面两个实例,可以看到输出内容前有一个公共信息,比如DEBUG:root。
这里面DEBUG指的是日志的输出等级,root回来补充!!!
其实这里也是可以自定义的
改变公共信息,需要的是指定logging.basicConfig的参数format
format |
描述 |
%(levelno)s |
打印日志级别的数值 |
%(levelname)s |
打印日志级别名称 |
%(pathname)s |
打印当前执行程序的路径,其实就是sys.argv[0] |
%(filename)s |
打印当前执行程序名 |
%(funcName)s |
打印日志的当前函数 |
%(lineno)d |
打印日志的当前行号 |
%(thread)d |
打印线程ID |
%(threadName)s |
打印线程名称 |
%(process)d |
打印进程ID |
%(message)s |
打印日志信息,主要使用这个参数,这个就是必须写上的 |
%(asctime)s |
打印当前时间 |
如果需要使用多个这些格式,用|来连接。
1.6 实例3
import logging logging.basicConfig(level=logging.DEBUG, format="%(asctime)s | %(message)s") logging.debug("this is debug")
控制台结果如下
2022-12-03 18:01:00,261 | this is debug
2.组件
四个核心类(组件)
名称 |
作用 |
Loggers |
记录器,提供应用程序代码直接使用的接口 |
Handlers |
处理器,将记录器产生的日志发送至目的地 |
Filters |
过滤器,提供更好的粒度控制,决定哪些日志会被输出 |
Formatters |
格式化器,设置日志内容的组成结构和消息字段 |
工作流程
2.1 Loggers
记录器,提供应用程序代码直接使用的接口。相当于笔,每个笔都有一个标识,不同的笔写下不同的东西。
from logging logger = logging.getLogger(__name__) # 创建一个画笔 # 决定日志记录的级别 logger.setLevel(level) # level为级别,如logging.DEDBUG
2.2 StreamHandler
标准输出stdout(如显示器)分发器。
from logging sh = logging.StreamHandler(stream=None) # 创建一个处理器 # 设置级别 sh.setLevel(level) # 参数同上 # 设置格式 sh.setFormatter(formatters) # formatters是Formatters对的对象,后面会讲到
2.3 FileHandler
from logging sh = logging.FileHandler(filename, mode='a', encoding=None, delay=False) # 创建一个处理器 # 设置级别 sh.setLevel(level) # 参数同上 # 设置格式 sh.setFormatter(formatters) # formatters是Formatters对的对象,后面会讲到
处理器除了上面两种还有一些,需要或遇到的时候百度!!!
2.4 Formatters
格式化器,设置日志内容的组成结构和消息字段。
import logging ft = logging.Formatter.__init__(fmt=None, datefmt=None, style="%") # style: 默认%,表示%(<dictionary key>s)格式的字符串。无特别需要,别动!!!
fmt参数构成与1.5节中提到的format参数一致