Files
apiautotest/utils/logger_utils/loguru_log.py

69 lines
3.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
# @Version: Python 3.9
# @Time : 2023/1/9 17:09
# @Author : chenyinhua
# @File : loguru_log.py
# @Software: PyCharm
# @Desc: 日志处理
# 标准库导入
import sys
# 第三方库导入
from loguru import logger
def capture_logs(filename, level="TRACE", filter_type=None):
"""
日志处理
文档参考https://zhuanlan.zhihu.com/p/429452898
基本参数释义:
sink可以是一个 file 对象,例如 sys.stderr 或 open('file.log', 'w'),也可以是 str 字符串或者 pathlib.Path 对象,即文件路径,也可以是一个方法,可以自行定义输出实现,也可以是一个 logging 模块的 Handler比如 FileHandler、StreamHandler 等,还可以是 coroutine function即一个返回协程对象的函数等。
level日志输出和保存级别。
format日志格式模板。
filter一个可选的指令用于决定每个记录的消息是否应该发送到 sink。
colorize格式化消息中包含的颜色标记是否应转换为用于终端着色的 ansi 代码,或以其他方式剥离。 如果没有,则根据 sink 是否为 tty电传打字机缩写 自动做出选择。
serialize在发送到 sink 之前,是否应首先将记录的消息转换为 JSON 字符串。
backtrace格式化的异常跟踪是否应该向上扩展超出捕获点以显示生成错误的完整堆栈跟踪。
diagnose异常跟踪是否应显示变量值以简化调试。建议在生产环境中设置 False避免泄露敏感数据。
enqueue要记录的消息是否应在到达 sink 之前首先通过多进程安全队列,这在通过多个进程记录到文件时很有用,这样做的好处还在于使日志记录调用是非阻塞的。
catch是否应自动捕获 sink 处理日志消息时发生的错误,如果为 True则会在 sys.stderr 上显示异常消息,但该异常不会传播到 sink从而防止应用程序崩溃。
\kwargs仅对配置协程或文件接收器有效的附加参数
日志级别,从低到高:
logger.trace() 等级5
logger.debug() 等级10
logger.info() 等级20
logger.success() 等级25
logger.warning() 等级30
logger.error() 等级40
logger.critical() 等级50
:param filename: 日志文件名
:param filter_type: 日志过滤将日志级别为ERROR的单独记录到一个文件中
:param level: 日志级别设置
"""
if level.upper() in ["TRACE", "DEBUG", "INFO", "SUCCESS", "WARNING", "ERROR", "CRITICAL"]:
level = level
else:
logger.error(f"level={level}, 值错误\n"
f"level的可选值是TRACE DEBUG INFO SUCCESS WARNING ERROR CRITICAL\n"
f"将默认level=trace收集日志")
level = "TRACE"
logger.remove() # 清除之前的设置
dic = dict(sink=filename, # 日志保存路径
rotation='10 MB',
retention='3 days',
format="{time:YYYY-MM-DD HH:mm:ss} | {level} | From {module}.{function}.{line} : {message}", # 日志输出格式
encoding='utf-8',
level=level, # 日志级别设置
enqueue=True
)
if filter_type:
dic["filter"] = lambda x: filter_type in str(x['level']).upper()
logger.add(**dic)
# 添加控制台输出
logger.add(sink=sys.stderr,
level=level,
format="{time:YYYY-MM-DD HH:mm:ss} | {level} | From {module}.{function}.{line} : {message}")