69 lines
3.6 KiB
Python
69 lines
3.6 KiB
Python
# -*- 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}")
|