hyf-backend/utils/util_log.py

111 lines
4.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.

from ruamel.yaml import YAML
from os.path import join, exists
from loguru import logger
from os import makedirs
import os, sys
import logging
from pathlib import Path
from utils.general import gradient_text
# 获取项目根目录
PROJECT_ROOT = Path(__file__).parent.parent.absolute()
# 自定义格式化函数
def relative_path_formatter(record):
"""将绝对路径转换为相对路径"""
try:
# 获取文件的绝对路径
abs_path = Path(record["file"].path)
# 转换为相对于项目根目录的路径
rel_path = abs_path.relative_to(PROJECT_ROOT)
record["extra"]["relative_path"] = str(rel_path)
except (ValueError, AttributeError):
# 如果转换失败,使用原文件名
record["extra"]["relative_path"] = record["file"].name
return record
# 定义一个日志处理器将标准日志转发到loguru
class LoguruHandler(logging.Handler):
def emit(self, record):
# 获取日志记录的级别和消息
level = record.levelname
message = self.format(record)
# 获取原始日志记录的位置信息
frame_data = {
"file": record.filename,
"line": record.lineno,
"function": record.funcName
}
# 将标准日志转发到loguru并使用原始位置信息
# logger.patch(lambda record: record.update(frame_data)).log(level, f'[后台消息] - {message}')
def getConfigs(path, read_type="yml"):
"""
读取配置文件并返回解析后的配置信息
:param path: 配置文件路径
:param read_type: 配置文件类型,默认为'yml',可选'json''yml'
:return: 解析后的配置信息JSON格式返回字典YML格式返回对应的数据结构
:raises Exception: 当无法获取配置信息时抛出异常
"""
path = path.replace("\\", "/")
yaml = YAML(typ="safe", pure=True)
with open(path, "r", encoding="utf-8") as f:
return yaml.load(f)
# 如果未成功读取配置信息,则抛出异常
raise Exception("路径: %s未获取配置信息" % path)
def init_logger(base_dir: str):
log_config = getConfigs(join(base_dir, "webIOs/configs/th_agenter_config_logger.yml"))
# 判断日志文件是否存在,不存在创建
base_path = join(base_dir, log_config.get("base_path"))
if not exists(base_path):
makedirs(base_path)
# 移除日志设置
logger.remove(handler_id=None)
# 打印日志到文件
if bool(log_config.get("enable_file_log")):
logger.add(
join(base_path, log_config.get("log_name")),
rotation=log_config.get("rotation"),
retention=log_config.get("retention"),
format=log_config.get("log_fmt"),
level=log_config.get("level"),
enqueue=True,
encoding=log_config.get("encoding"),
filter=relative_path_formatter,
diagnose=True
)
# 控制台输出
if bool(log_config.get("enable_stderr")):
logger.add(
sys.stderr,
format=log_config.get("log_fmt"),
level=log_config.get("level"),
enqueue=True,
filter=relative_path_formatter,
diagnose=True
)
log_level = log_config.get("level", "INFO")
logging.basicConfig(handlers=[LoguruHandler()], level=log_level)
# 特别配置uvicorn和fastapi的日志记录器
for logger_name in ["uvicorn", "uvicorn.access", "uvicorn.error", "fastapi"]:
uvicorn_logger = logging.getLogger(logger_name)
uvicorn_logger.handlers = [LoguruHandler()]
uvicorn_logger.propagate = False
print("\n\n\n")
logger.info(f"----=========== {gradient_text('日志配置初始化完成, 开始新的日志记录')} ===========----")
logger.info("🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀")
logger.info("🚀 DDDD RRRR GGGG RRRR AAA PPPPP H H ")
logger.info("🚀 D D R R G R R A A P P H H ")
logger.info("🚀 D D RRRR GGGGG RRRR AAAAA PPPPP HHHHH ")
logger.info("🚀 D D R R G G R R A A P H H ")
logger.info("🚀 DDDD R R GGGGG R R A A P H H ")
logger.info("🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀")