目录
- logging实例配置日志级别参数可写str或者int类型
- Handler对象
- 常用的handler实例对象
- 给handler对象设置日志级别
- 给handler对象设置日志输出格式
- logging配置
- error级别以上日志发送邮件
logging实例配置日志级别参数可写str或者int类型
logger.setLevel(level)方法配置过滤日志级别
根据源码可以看到参数level可以使int类型或者string类型,
以debug级别为例,level写int类型: logger.setLevel(10)
;
level写str类型:logger.setLevel(logging.DEBUG)
这种比较直观
def setLevel(self, level):
"""
Set the logging level of this logger. level must be an int or a str.
"""
self.level = _checkLevel(level)
self.manager._clear_cache()
级别(高到低):CRITICAL、ERROR、WARNING、INFO、DEBUG、NOTSET;
对应int:CRITICAL = 50
、ERROR = 40
、WARNING = 30
、INFO = 20
、DEBUG = 10
、NOTSET = 0
Handler对象
handler对象负责根据日志级别分配日志消息的最终流向。Logger对象默认不包含handler对象,但是可用通过addHandler()方法添加。举例一个应用场景:假设你的应用程序需要将所有日志消息保存在日志文件中;把ERROR级别及以上的日志打印在标准输出;所有的CIRITCAL级别的日志通过电子邮件发给你。整个场景需要三个handler实例,每个实例都会根据不同的日志级别采取不同的方式处理日志消息。来源
常用的handler实例对象
- logging.StreamHandler():输出日志到控制台
- logging.FileHandler():输出日志到日志文件
- RotatingFileHandler:将消息写入磁盘文件,并在日志文件的占用空间达到最大值的时候滚动日志文件
- TimedRotatingHandler:将消息写入磁盘文件,并在根据指定的时间间隔滚动日志文件
- SMTPHandler:将日志消息发送到指定的电子邮箱
- NullHandler:对于错误日志没有任何响应。如果在功能库的开发中想要使用logging,但是又要在没有配置信息时避免显示类似‘No handlers could be found for logger XXX’ 这种消息,可以考虑使用NullHandler。
logging核心模块仅包含基本的一些handler类(NullHandler、StreamHandler和FileHandler),剩下的handler并不直接可用,而是需要主动导入logging.handlers和logging.config。
给handler对象设置日志级别
用的是handler的setLevel()
方法,和logger的长得一样,但是效果不一样。logger.setLevel()
决定了能够被传递到handler对象的最低级别。而handler.setLevel()
决定了会被记录下来的最低日志级别,如果不设置默认使用logger的日志级别。
给handler对象设置日志输出格式
设置日志输出格式靠的是Formatter对象,例子:
format = logging.Formatter(fmt='%(asctime)s - %(levelname)s - %(funcName)s - %(message)s', datefmt='%Y年%m月%d日 %H:%M:%S')
打印出来的日志:
2022年06月09日 15:17:02 - INFO - read_get_token_yaml - 加载./interface_data_yaml/get_token.yaml文件......
format参数中可能用到的格式化串:来源
- %(name)s Logger的名字
- %(levelno)s 数字形式的日志级别
- %(levelname)s 文本形式的日志级别
- %(pathname)s 调用日志输出函数的模块的完整路径名
- %(filename)s 调用日志输出函数的模块的文件名
- %(module)s 调用日志输出函数的模块名
- %(funcName)s 调用日志输出函数的函数名
- %(lineno)d 调用日志输出函数的语句所在的代码行
- %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
- %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
- %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
- %(thread)d 线程ID。
- %(threadName)s 线程名。
- %(process)d 进程ID。
- %(message)s 用户输出的消息
logging配置
log_util.py文件
def get_logger(name):
logger = logging.getLogger(name)
logger.setLevel(10) # 设置总日志等级
format = logging.Formatter(fmt='%(asctime)s - %(levelname)s - %(funcName)s - %(message)s', datefmt='%Y年%m月%d日 %H:%M:%S') # 日志格式
cli_handler = logging.StreamHandler() # 输出到屏幕的日志处理器
file_handler = logging.FileHandler(filename='E:/1229Py/log/run.log', mode='a', encoding='utf-8') # 输出到文件的日志处理器,mode默认是’a’,即添加到文件末尾,‘w’是覆盖写入
cli_handler.setFormatter(format) # 设置屏幕日志格式
file_handler.setFormatter(format) # 设置文件日志格式
cli_handler.setLevel(logging.INFO) # 设置屏幕日志等级, 可以大于日志记录器设置的总日志等级
# file_handler.setLevel(logging.DEBUG) # 不设置默认使用logger的等级
logger.handlers.clear() # 清空已有处理器, 避免继承了其他logger的已有处理器
logger.addHandler(cli_handler) # 将屏幕日志处理器添加到logger
logger.addHandler(file_handler) # 将文件日志处理器添加到logger
return logger
yaml_util.py调用:
logger = get_logger('logger')
#读取yaml文件
def read_get_token_yaml(yaml_path):
logger.info("加载{}文件......".format(yaml_path))
with open(os.getcwd()+yaml_path,encoding="utf-8",mode="r") as f:
value = yaml.load(stream=f,Loader=yaml.FullLoader)
logger.info("读取到的数据===>{}".format(value))
return value
log文件记录到的日志:
2022年06月09日 15:17:02 - INFO - read_get_token_yaml - 加载./interface_data_yaml/get_token.yaml文件......
2022年06月09日 15:17:02 - INFO - read_get_token_yaml - 读取到的数据===>[{'name': '获取token的接口', 'request': {'method': 'post', 'url': 'http://192.168.00.00:9999/auth/uCmttLogin', 'params': {'username': 13408000000, 'password': 123456}}, 'validate': 'None'}]
2022年06月09日 15:17:03 - INFO - wirte_extract_yaml - 写入方法收到的access_token===>{'access_token': 'c19b2d524775b3e8d069b7573d5be49c5e1419401ad1897d28715975d0f2c43558'}
2022年06月09日 15:17:03 - INFO - wirte_extract_yaml - 写入方法的返回值===>None
error级别以上日志发送邮件
待完善