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()
