Merge pull request #3664 from Aqr-K/feature/log

This commit is contained in:
jxxghp
2025-01-03 13:38:18 +08:00
committed by GitHub
2 changed files with 43 additions and 7 deletions
+10 -2
View File
@@ -10,7 +10,7 @@ from typing import Any, Dict, List, Optional, Tuple, Type
from dotenv import set_key from dotenv import set_key
from pydantic import BaseModel, BaseSettings, validator, Field from pydantic import BaseModel, BaseSettings, validator, Field
from app.log import logger from app.log import logger, log_settings, LogConfigModel
from app.utils.system import SystemUtils from app.utils.system import SystemUtils
from app.utils.url import UrlUtils from app.utils.url import UrlUtils
@@ -244,7 +244,7 @@ class ConfigModel(BaseModel):
TOKENIZED_SEARCH: bool = False TOKENIZED_SEARCH: bool = False
class Settings(BaseSettings, ConfigModel): class Settings(BaseSettings, ConfigModel, LogConfigModel):
""" """
系统配置类 系统配置类
""" """
@@ -406,6 +406,8 @@ class Settings(BaseSettings, ConfigModel):
# 仅成功更新配置时,才更新内存 # 仅成功更新配置时,才更新内存
if success: if success:
setattr(self, key, converted_value) setattr(self, key, converted_value)
if hasattr(log_settings, key):
setattr(log_settings, key, converted_value)
return success, message return success, message
return True, "" return True, ""
except Exception as e: except Exception as e:
@@ -416,8 +418,14 @@ class Settings(BaseSettings, ConfigModel):
更新多个配置项 更新多个配置项
""" """
results = {} results = {}
log_updated = False
for k, v in env.items(): for k, v in env.items():
results[k] = self.update_setting(k, v) results[k] = self.update_setting(k, v)
if hasattr(log_settings, k):
log_updated = True
# 本次更新存在日志配置项更新,需要重新加载日志配置
if log_updated:
logger.update_loggers()
return results return results
@property @property
+33 -5
View File
@@ -5,15 +5,19 @@ from pathlib import Path
from typing import Dict, Any, Optional from typing import Dict, Any, Optional
import click import click
from pydantic import BaseSettings from pydantic import BaseSettings, BaseModel
from app.utils.system import SystemUtils from app.utils.system import SystemUtils
class LogSettings(BaseSettings): class LogConfigModel(BaseModel):
""" """
日志设置 Pydantic 配置模型,描述所有配置项及其类型和默认值
""" """
class Config:
extra = "ignore" # 忽略未定义的配置项
# 配置文件目录 # 配置文件目录
CONFIG_DIR: Optional[str] = None CONFIG_DIR: Optional[str] = None
# 是否为调试模式 # 是否为调试模式
@@ -29,6 +33,12 @@ class LogSettings(BaseSettings):
# 文件日志格式 # 文件日志格式
LOG_FILE_FORMAT: str = "%(levelname)s%(asctime)s - %(message)s" LOG_FILE_FORMAT: str = "%(levelname)s%(asctime)s - %(message)s"
class LogSettings(BaseSettings, LogConfigModel):
"""
日志设置类
"""
@property @property
def CONFIG_PATH(self): def CONFIG_PATH(self):
return SystemUtils.get_config_path(self.CONFIG_DIR) return SystemUtils.get_config_path(self.CONFIG_DIR)
@@ -124,7 +134,8 @@ class LoggerManager:
def __setup_logger(log_file: str): def __setup_logger(log_file: str):
""" """
设置日志 设置日志
log_file:日志文件相对路径
:param log_file:日志文件相对路径
""" """
log_file_path = log_settings.LOG_PATH / log_file log_file_path = log_settings.LOG_PATH / log_file
log_file_path.parent.mkdir(parents=True, exist_ok=True) log_file_path.parent.mkdir(parents=True, exist_ok=True)
@@ -134,6 +145,8 @@ class LoggerManager:
if log_settings.DEBUG: if log_settings.DEBUG:
_logger.setLevel(logging.DEBUG) _logger.setLevel(logging.DEBUG)
# 全局日志等级
else: else:
loglevel = getattr(logging, log_settings.LOG_LEVEL.upper(), logging.INFO) loglevel = getattr(logging, log_settings.LOG_LEVEL.upper(), logging.INFO)
_logger.setLevel(loglevel) _logger.setLevel(loglevel)
@@ -162,6 +175,21 @@ class LoggerManager:
return _logger return _logger
def update_loggers(self):
"""
更新日志实例
"""
_new_loggers: Dict[str, Any] = {}
for log_file, _logger in self._loggers.items():
# 移除已有的 handler,避免重复添加
for handler in _logger.handlers:
_logger.removeHandler(handler)
# 重新设置日志实例
_new_logger = self.__setup_logger(log_file=log_file)
_new_loggers[log_file] = _new_logger
self._loggers = _new_loggers
def logger(self, method: str, msg: str, *args, **kwargs): def logger(self, method: str, msg: str, *args, **kwargs):
""" """
获取模块的logger 获取模块的logger
@@ -181,7 +209,7 @@ class LoggerManager:
# 获取调用者的模块的logger # 获取调用者的模块的logger
_logger = self._loggers.get(logfile) _logger = self._loggers.get(logfile)
if not _logger: if not _logger:
_logger = self.__setup_logger(logfile) _logger = self.__setup_logger(log_file=logfile)
self._loggers[logfile] = _logger self._loggers[logfile] = _logger
# 调用logger的方法打印日志 # 调用logger的方法打印日志
if hasattr(_logger, method): if hasattr(_logger, method):