38. 日志
一、日志的基本使用
logger.debug(msg, *args, **kwargs) # 输出调试日志
logger.info(msg, *args, **kwargs) # 输出消息日志
logger.warning(msg, *args, **kwargs) # 输出警告日志
logger.error(msg, *args, **kwargs) # 输出错误日志
logger.critical(msg, *args, **kwargs) # 输出严重日志
logging.basicConfig(**kwargs) # 配置日式输出信息
在 Python 中系统内置的日志级别有六种:DEBUG、INFO、WARNING(默认值)、ERROR 以及 CRITICAL,系统会输出到控制台或者保存到日志文件的日志信息一定是等于或者高于当前等级的信息,例如当 level=logging.WARNING 时,只会输出或者保存 WARNING、ERROR 和 CRITICAL 级别的信息,其他级别的日志信息不会显示或保存,这也是 level 这个参数控制输出的意义所在。
日志级别 | 数值 |
---|---|
logging.CRITICAL | 50 |
logging.ERROR | 40 |
logging.WARNING | 30 |
logging.INFO | 20 |
logging.DEBUG | 10 |
logging.NOTSET | 0 |
定义山中日志输出格式,日志中可能用到的格式串如下:
格式串 | 描述 |
---|---|
%(name)s | Logger 的名字 |
%(levelno)s | 数字形式的日志级别 |
%(levelname)s | 文本形式的日志级别 |
%(pathname)s | 调试日志输出函数的模式的完整路径名,可能没有 |
%(filename)s | 调试日志输出函数的模块的文件名 |
%(module)s | 调试日志输出函数的模块名 |
%(funcName)s | 调试日志输出函数的函数名 |
%(lineno)s | 调式日志输出函数的语句所在的代码行 |
%(created)s | 当前时间,用 UNIX 标准的表示时间的浮点数表示 |
%(relativeCreated)d | 输出日志信息时的,自 Logger 创建以来的毫秒数 |
%(asctime)s | 字符串形式的当前时间,默认格式是 “年-月-日 时:分:秒,毫秒” |
%(thread)d | 线程 ID,可能没有 |
%(threadName)s | 线程名,可能没有 |
%(process)d | 进程 ID,可能没有 |
%(message)s | 用户输出信息 |
import logging
logging.basicConfig(
# 日志输出位置:1、中断 2、文件
filename="access.log", # 不指定,默认打印到中断
# 日记格式:
format="%(asctime)s - %(name)s - %(levelname)s - %(module)s: %(message)s",
# 时间格式
datefmt="%Y-%m-%d %H:%M:%S %p",
# 日记级别:critical(50) error(40) warning(30) info(20) debut(10)
level=10,
)
logging.debug("debug调试日志")
logging.info("info消息日志")
logging.warning("warning警告日志")
logging.error("error错误日志")
logging.critical("critical严重日志")
二、日志字典的使用
Python 3.2 中引入的一种新的配置日志记录的方法–用字典来保存logging配置信息。这相对于上面所讲的基于配置文件来保存 logging 配置信息的方式来说,功能更加强大,也更加灵活,因为我们可把很多的数据转换成字典。
传递给 dictConfig() 函数的字典对象只能包含下面这些 keys,其中 version 是必须指定的 key,其它 key 都是可选项:
key 名称 | 描述 |
---|---|
version | 必选项,其值是一个整数值,表示配置格式的版本,当前唯一可用的值就是 1。 |
formatters | 可选项,其值是一个字典对香港,该字典对象每个元素的 key 为要定义的格式器名称,value 为格式器的配置信息组成的 dict。 |
filters | 可选项,其值是一个字典对象,该字典对象每个元素的 key 为要定义的过滤器名称,value 为过滤器的配置信息组成的 dict。 |
handlers | 可选项,其值是一个字典对象,该字典对象每个元素的 key 为要定义的处理器名称,value 为处理器的配置信息组成的 dict。 |
loggers | 可选项,其值是一个字典对象,该字典对象每个元素的 key 为要定义的日志器名称,value 为日志器的配置信息组成的 dict。 |
root | 可选项,这是 root logger 的配置信息,其值也是一个字典对象。除非咋定义其它 logger 时明确指定 propagate 值为 no,否则 root logger 定义的 handlers 都会被作用到其它 logger 上。 |
incremental | 可选项,默认值为 False。该选项的意义在于,如果这里定义的对象已经存在,那么这里对这些对象的定义是应用到以存在的对象上。值为 False 表示,以存在的对象将会被重新定义。 |
disable_existing_loggers | 可选项,默认值为 True。该选项用于指定是否禁用以存在的日志器 loggers,如果 incremental 的值为 True 则该选项将会被忽略。 |
# 定义日志输出格式开始
standard_format = "[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]" \
"[%(levelname)s][%(message)s]"
simple_format = "[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s"
# log配置字典
LOGGING_DIC = {
"version": 1,
"disable_existing_loggers": False,
"formatters": {
# 自定义的日志格式
"standard": {
"format": standard_format
},
"simple": {
"format": simple_format
},
},
"filters": {}, # 过滤日志
# handlers是日记的接收者,不同的handler会将日志输出到不同的位置
"handlers": {
# 打印到终端的日志
"console": {
"level": "DEBUG",
"class": "logging.StreamHandler", # 打印到屏幕
"formatter": "simple"
},
# 打印到文件的日志,收集info及以上的日志
"default": {
"level": "DEBUG",
"class": "logging.handlers.RotatingFileHandler", # 保存到文件
"formatter": "standard",
"filename": "access.log", # 日志文件文件
"maxBytes": 1024*1024*5, # 日志文件大小,达到大小后生成新的日志文件
"backupCount": 5, # 日志文件的个数
"encoding": "utf-8", # 日志文件的编码
},
},
# loggers是日志的产生着,产生的日志会传递给handler然后控制输出
"loggers": {
# logging.getLogger(__name__)拿到的logger配置
"用户交易": {
# 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
"handlers": ["default", "console"],
"level": "DEBUG",
"propagate": False, # 默认为True,向上(更高level的logger)传递
},
# logging.getLogger(__name__)拿到的logger配置
"": {
# 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
"handlers": ["default", "console"],
"level": "DEBUG",
"propagate": False, # 默认为True,向上(更高level的logger)传递
},
},
}
import logging
import logging.config
logging.config.dictConfig(LOGGING_DIC) # logging模块加载字典中的配置
logger = logging.getLogger("用户交易") # 获取指定的日志生产者
logger.debug("订单生成")
# loggers配置中使用空字符串作为字典的键 兼容性最好
logger = logging.getLogger("常规操作") # 获取指定的日志生产者
logger.debug("用户登录")