111 lines
4.6 KiB
Python
111 lines
4.6 KiB
Python
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("🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀")
|