- 接入数据库驱动的七维风险评分第一阶段逻辑\n- 增加主模型失败后的 DeepSeek 语义、流式和预防建议兜底\n- 将 AI 预防建议改为基于评分、历史异常和标准规则动态生成\n- 增加无历史案例时的标准库兜底校验和通用规则匹配\n- 修复未知供应商识别及测试占位名称过滤\n- 增加后端滚动日志文件配置和 LLM 请求日志\n- 历史会话直接读取已保存结果,避免重新调用模型和重算风险\n- 补充评分、供应商识别和 LLM 协议测试
61 lines
1.9 KiB
Python
61 lines
1.9 KiB
Python
"""Shared logging setup."""
|
|
|
|
import logging
|
|
from logging.handlers import RotatingFileHandler
|
|
from pathlib import Path
|
|
|
|
LOGGER_NAME = "dieya_risk_prediction"
|
|
LOG_DIR = Path(__file__).resolve().parents[2] / "logs"
|
|
LOG_FILE = LOG_DIR / "backend.log"
|
|
_FORMAT = "%(asctime)s %(levelname)s %(name)s %(message)s"
|
|
|
|
|
|
def configure_logging(level: str = "INFO") -> logging.Logger:
|
|
logger = logging.getLogger(LOGGER_NAME)
|
|
logger.setLevel(level.upper())
|
|
logger.propagate = False
|
|
LOG_DIR.mkdir(parents=True, exist_ok=True)
|
|
formatter = logging.Formatter(_FORMAT)
|
|
file_handler = next(
|
|
(
|
|
handler
|
|
for handler in logger.handlers
|
|
if getattr(handler, "_dieya_file_handler", False)
|
|
),
|
|
None,
|
|
)
|
|
if file_handler is None:
|
|
file_handler = RotatingFileHandler(
|
|
LOG_FILE,
|
|
maxBytes=10 * 1024 * 1024,
|
|
backupCount=5,
|
|
encoding="utf-8",
|
|
)
|
|
file_handler._dieya_file_handler = True
|
|
file_handler.setFormatter(formatter)
|
|
logger.addHandler(file_handler)
|
|
root_logger = logging.getLogger()
|
|
root_logger.setLevel(level.upper())
|
|
if not any(getattr(handler, "_dieya_file_handler", False) for handler in root_logger.handlers):
|
|
root_file_handler = RotatingFileHandler(
|
|
LOG_FILE,
|
|
maxBytes=10 * 1024 * 1024,
|
|
backupCount=5,
|
|
encoding="utf-8",
|
|
)
|
|
root_file_handler._dieya_file_handler = True
|
|
root_file_handler.setFormatter(formatter)
|
|
root_logger.addHandler(root_file_handler)
|
|
if not any(
|
|
isinstance(handler, logging.StreamHandler)
|
|
and not getattr(handler, "_dieya_file_handler", False)
|
|
for handler in logger.handlers
|
|
):
|
|
stream_handler = logging.StreamHandler()
|
|
stream_handler.setFormatter(formatter)
|
|
logger.addHandler(stream_handler)
|
|
return logger
|
|
|
|
|
|
logger = configure_logging()
|