python loguru使用 sys._getframe(1) 获取调用函数的栈帧信息,并从中提取文件名、行号和函数名

import sys
import traceback
from loguru import logger

def api_log(info, level="INFO"):
    """
    记录日志信息,输出调用该日志方法的行信息

    :param info: 日志信息
    :param level: 日志级别,默认是INFO
    """
    try:
        # 移除所有现有的日志处理器
        logger.remove(handler_id=None)

        # 获取调用栈信息,获取调用日志方法的文件名、行号和函数名
        frame = sys._getframe(1)  # 获取调用函数的栈帧
        filename = frame.f_code.co_filename
        lineno = frame.f_lineno
        funcname = frame.f_code.co_name

        # 添加一个新的日志处理器到stderr,并绑定额外的字段
        logger.add(
            sink=sys.stderr,
            format=(
                "<red>{time:YYYY-MM-DD HH:mm:ss}</red> "
                "<light-white>|</light-white> "
                "<light-blue>{level}</light-blue> "
                "<light-white>|</light-white> "
                "<light-yellow>{extra[file]}</light-yellow><light-cyan> -> </light-cyan>"
                "<light-yellow>{extra[function]}</light-yellow><light-cyan> -> </light-cyan>"
                "<light-yellow>{extra[line]}</light-yellow> "
                "<light-white>|</light-white> "
                "<light-white>-> info: {message}</light-white>"
            ),
            level=level,
            colorize=True,
        )

        # 根据日志级别记录日志信息,并绑定额外的字段
        if level.upper() == "INFO":
            logger.bind(file=filename, function=funcname, line=lineno).info(info)
        elif level.upper() == "DEBUG":
            logger.bind(file=filename, function=funcname, line=lineno).debug(info)
        elif level.upper() == "WARNING":
            logger.bind(file=filename, function=funcname, line=lineno).warning(info)
        elif level.upper() == "ERROR":
            logger.bind(file=filename, function=funcname, line=lineno).error(info)
        elif level.upper() == "CRITICAL":
            logger.bind(file=filename, function=funcname, line=lineno).critical(info)
        else:
            logger.bind(file=filename, function=funcname, line=lineno).info(info)

    except Exception as e:
        print(f"记录日志时出错: {e}")


if __name__ == '__main__':
    # 示例用法
    def my_function():
        api_log("这是一条来自函数的日志信息")

    my_function()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值