logging模块
01.logging模块用于输出日志。
- 日志的级别和其对应的数值。
- CRITICAL,50。
- ERROR,40。
- WARNING,30,默认级别。
- INFO,20。
- DEBUG,10。
- NOTSET,0。
- logging模块的基本配置格式为:
logging.basicConfig(**args)
- 日志模块的基本配置的常用参数包括:
- level,日子级别,当输出的日志级别低于基本配置中的日志级别时,将不予显示。
- fomat,日志格式,多个日志项之间以空格分隔,常用的日志格式包括:
- %(asctime)s,日志输出时间。
- %(levelname)s,日志级别。
- %(mesage)s,日志的内容。
- %(process)d,进程PID。
- %(processName)s,进程的名称。
- datefmt,日期格式,比如:”%Y-%m-%d %H:%M:%S”
- logging模块的简单示例:
import logging
# 设置一个日期格式,显示出毫秒
log_format = """
%(asctime)s.%(msecs)03d %(levelname)s %(process)d %(traceid)s %(message)s
"""
# 设置日志基本格式,并且输出到文件
logging.basicConfig(level=logging.INFO,
format=log_format,
filename="/tmp/info.txt",
datefmt="%Y-%m-%d %H:%M:%S")
# 设置一个字典,用于传递额外的数据,其中key等于日志设置中的日志格式名称
data = {"traceid": "d38e7fc0de8ffdc2c803"}
# logging输出的日志级别必须大于等于basicConfig中设定的级别
logging.info("Hello World", extra=data)
# 2021-10-03 14:42:54.732 INFO 31140 d38e7fc0de8ffdc2c803 Hello World
- logging输出只能有一个实参。
02.logging的构造:
- 使用工厂方法可以返回一个Logger的实例,其格式为:
logging.getLogger([name=None])
- 指定name可以返回一个名称为name的Logger实例,如果再次使用相同的名字则返回同一个实例。
- 若未指定name,则返回根Logger实例(root)。
- Logger实例使用addHandler()方法可以单独为日志设置各类属性,其格式为:
logger.addHandler(handler对象)
- handler对象为文件输出和标准输出:
- logging.StreamHandler(stream=None),标准输出。
- logging.StreamHandler(‘/path/to/file’),文件输出。
- handler对象的方法包括:
- setLevel,设置日志级别,其初始日志级别为0。
- setFormatter,设置日志格式。
- Logging的构造示例:
import logging
# 设置一个日期格式,显示出毫秒
log_format = "%(asctime)s.%(msecs)03d %(levelname)s %(process)d %(traceid)s %(message)s"
# 设置一个handler,用于指定文件位置
fh = logging.FileHandler('/tmp/error.log')
# 设置日志级别
fh.setLevel(logging.INFO)
# 设置日志格式与时间格式
fh.setFormatter(logging.Formatter(log_format, datefmt="%Y-%m-%d %H:%M:%S"))
# 创建一个logger对象
logger = logging.getLogger(__name__)
# 调用handler,设置文件输出位置
logger.addHandler(fh)
# 设置一个字典,用于传递额外的数据,其中key等于日志设置中的日志格式名称
data = {"traceid": "d38e7fc0de8ffdc2c803"}
logger.error("Hello World", extra=data)
03.logging消息传递:
- 消息传递的流程:
- 消息在某一个logger对象上产生,这个logger就是当前logger。
- 消息level和当前logger对象的EffectiveLevel比较,如果低于当前当前logger对象的EffectiveLevel,则流程结束,否则生成日志。
- logger对象创建后其level默认为0。
- logger对象的EffectiveLevel值为父logger的level;如果父logger的level为0,则一层层向上追溯直到root logger。
- 消息level和当前logger对象的EffectiveLevel比较,如果低于当前当前logger对象的EffectiveLevel,则流程结束,否则生成日志。
- 生成的日志交给当前的logger的所有handler处理。
- 日志的level和每一个handler的level比较,低于当前handler的level的日志不处理,否则按照handler设置输出日志记录。
- 当前logger中所有handler处理完成后,判断logger的propagate属性;值为True则向父logger传递,否则流程结束。
- logger实例初始的propagate值为True,即允许向父logger传递消息。
- 日志传递给父logger,不需要和父logger的level比较,而是直接交给父logger的所有handler处理,父logger成为当前logger。
- 重复handler的处理流程,直到当前logger的父logger是None退出。
- 如果root没有handler,就默认创建一个StreamHandler,如果设置了filename,就创建一个FileHandler。
- 重复handler的处理流程,直到当前logger的父logger是None退出。
- 消息在某一个logger对象上产生,这个logger就是当前logger。
- 消息传递的示例:
import logging
# 设置一个日期格式,显示出毫秒
log_format = "%(asctime)s.%(msecs)03d %(levelname)s %(process)d %(traceid)s %(message)s"
# 设置root的logger,由于没有filename,因此会创建一个StreamHandler
logging.basicConfig(level=logging.INFO,
format=log_format,
datefmt="%Y-%m-%d %H:%M:%S")
# 设置一个handler,用于指定文件位置
fh = logging.FileHandler('/tmp/error.log')
# 设置日志级别
fh.setLevel(logging.INFO)
fh.setFormatter(logging.Formatter(log_format, datefmt="%Y-%m-%d %H:%M:%S"))
# 创建一个logger对象
logger = logging.getLogger(__name__)
# 调用handler,设置文件输出位置
logger.addHandler(fh)
# 设置一个字典,用于传递额外的数据,其中key等于日志设置中的日志格式名称
data = {"traceid": "d38e7fc0de8ffdc2c803"}
# 打印日志,由于propagate为True,因此会传递到root的handler中,即输出到文件后又在标准输出中打印
logger.error("Hello World", extra=data)
文档更新时间: 2021-10-03 21:09 作者:闻骏