初始化代码

This commit is contained in:
wzy-warehouse
2026-05-08 15:42:32 +08:00
parent 7d18effcfe
commit 4ef23fec7c
26 changed files with 140 additions and 2263 deletions
+66 -81
View File
@@ -1,104 +1,89 @@
"""
日志配置工具
日志工具
支持按天分割、自动清理过期日志
"""
import logging
import sys
from pathlib import Path
from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler
from datetime import datetime
from logging.handlers import TimedRotatingFileHandler
from datetime import datetime, timedelta
class LoggerConfig:
"""日志配置类"""
def __init__(self, log_dir: str = "logs", log_level: str = "INFO"):
self.log_dir = Path(log_dir)
self.log_level = getattr(logging, log_level.upper(), logging.INFO)
self.ensure_log_directory()
def ensure_log_directory(self):
"""确保日志目录存在"""
if not self.log_dir.exists():
self.log_dir.mkdir(parents=True, exist_ok=True)
def setup_logger(
self,
name: str = "app",
log_file: str = None,
max_bytes: int = 10 * 1024 * 1024, # 10MB
backup_count: int = 5,
use_timed_rotation: bool = False
) -> logging.Logger:
"""配置日志记录器
class LoggerManager:
"""日志管理器"""
_loggers = {}
@classmethod
def get_logger(cls, name: str = "algorithm", log_dir: str = "logs") -> logging.Logger:
"""
获取日志记录器
Args:
name: 日志记录器名称
log_file: 日志文件名(None则使用时间戳)
max_bytes: 单个日志文件最大大小
backup_count: 保留的备份文件数量
use_timed_rotation: 是否使用按时间轮转
name: 日志名称
log_dir: 日志目录
Returns:
配置好的Logger实例
logging.Logger 实例
"""
if name in cls._loggers:
return cls._loggers[name]
# 创建日志目录
log_path = Path(log_dir)
log_path.mkdir(parents=True, exist_ok=True)
# 创建 logger
logger = logging.getLogger(name)
logger.setLevel(self.log_level)
# 避免重复添加handler
logger.setLevel(logging.DEBUG)
# 避免重复添加 handler
if logger.handlers:
cls._loggers[name] = logger
return logger
# 创建formatter
# 日志格式
formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s',
'%(asctime)s [%(threadName)s] %(levelname)-5s %(name)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
# 控制台handler
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(self.log_level)
# 控制台 Handler
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
# 文件handler
if log_file is None:
timestamp = datetime.now().strftime("%Y%m%d")
log_file = f"app_{timestamp}.log"
log_path = self.log_dir / log_file
if use_timed_rotation:
# 按时间轮转(每天)
file_handler = TimedRotatingFileHandler(
log_path,
when='midnight',
interval=1,
backupCount=backup_count,
encoding='utf-8'
)
else:
# 按大小轮转
file_handler = RotatingFileHandler(
log_path,
maxBytes=max_bytes,
backupCount=backup_count,
encoding='utf-8'
)
file_handler.setLevel(self.log_level)
# 文件 Handler - 按天分割
log_file = log_path / f"{name}.log"
file_handler = TimedRotatingFileHandler(
filename=str(log_file),
when='midnight',
interval=1,
backupCount=7,
encoding='utf-8'
)
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(formatter)
# 设置日志文件命名格式
file_handler.suffix = "%Y-%m-%d.log"
logger.addHandler(file_handler)
cls._loggers[name] = logger
return logger
# 便捷函数
def get_logger(name: str = "algorithm", log_dir: str = "logs") -> logging.Logger:
"""
获取日志记录器的便捷函数
@staticmethod
def get_logger(name: str = "app") -> logging.Logger:
"""获取logger实例"""
return logging.getLogger(name)
# 全局日志配置
def setup_logging(log_dir: str = "logs", log_level: str = "INFO") -> logging.Logger:
"""设置全局日志"""
logger_config = LoggerConfig(log_dir, log_level)
return logger_config.setup_logger()
Args:
name: 日志名称
log_dir: 日志目录
Returns:
logging.Logger 实例
"""
return LoggerManager.get_logger(name, log_dir)
-137
View File
@@ -1,137 +0,0 @@
"""
平台检测工具 - 兼容Windows和Linux
"""
import sys
import os
import platform
from pathlib import Path
from typing import Tuple
class PlatformDetector:
"""平台检测器"""
def __init__(self):
self.os_name = os.name
self.platform_system = platform.system()
self.platform_release = platform.release()
self.platform_version = platform.version()
self.python_version = sys.version_info
self.is_windows = self.platform_system == "Windows"
self.is_linux = self.platform_system == "Linux"
self.is_macos = self.platform_system == "Darwin"
def get_platform_info(self) -> dict:
"""获取平台信息"""
return {
"os_name": self.os_name,
"platform_system": self.platform_system,
"platform_release": self.platform_release,
"platform_version": self.platform_version,
"python_version": f"{self.python_version.major}.{self.python_version.minor}.{self.python_version.micro}",
"is_windows": self.is_windows,
"is_linux": self.is_linux,
"is_macos": self.is_macos,
}
def check_python_version(self, min_version: Tuple[int, int] = (3, 13)) -> bool:
"""检查Python版本是否满足要求
Args:
min_version: 最低版本要求 (major, minor)
Returns:
是否满足版本要求
"""
current = (self.python_version.major, self.python_version.minor)
return current >= min_version
def get_path_separator(self) -> str:
"""获取路径分隔符"""
return "\\" if self.is_windows else "/"
def normalize_path(self, path: str) -> str:
"""标准化路径"""
return Path(path).as_posix()
def get_project_root(self) -> Path:
"""获取项目根目录"""
return Path(__file__).parent.parent.parent
def ensure_directory(self, path: Path, create: bool = True) -> bool:
"""确保目录存在
Args:
path: 目录路径
create: 是否自动创建
Returns:
目录是否存在
"""
if path.exists():
return True
if create:
try:
path.mkdir(parents=True, exist_ok=True)
return True
except Exception as e:
print(f"创建目录失败 {path}: {e}")
return False
return False
def get_env_file_path(self) -> Path:
"""获取环境配置文件路径"""
return self.get_project_root() / ".env"
def format_command_for_platform(self, command: str) -> str:
"""根据平台格式化命令
Args:
command: 原始命令
Returns:
适合当前平台的命令
"""
if self.is_windows:
# Windows特定命令转换
if command.startswith("ls "):
return command.replace("ls ", "dir ")
elif command.startswith("cat "):
return command.replace("cat ", "type ")
elif command.startswith("rm "):
return command.replace("rm ", "del ")
elif command.startswith("cp "):
return command.replace("cp ", "copy ")
elif command.startswith("mv "):
return command.replace("mv ", "move ")
else:
# Linux/Mac特定命令转换
if command.startswith("dir "):
return command.replace("dir ", "ls ")
elif command.startswith("type "):
return command.replace("type ", "cat ")
elif command.startswith("del "):
return command.replace("del ", "rm ")
elif command.startswith("copy "):
return command.replace("copy ", "cp ")
elif command.startswith("move "):
return command.replace("move ", "mv ")
return command
def print_platform_banner(self):
"""打印平台信息横幅"""
info = self.get_platform_info()
print("=" * 60)
print(" 系统信息")
print("=" * 60)
print(f" 操作系统: {info['platform_system']} {info['platform_release']}")
print(f" Python版本: {info['python_version']}")
print(f" 项目根目录: {self.get_project_root()}")
print("=" * 60)
# 全局平台检测器实例
platform_detector = PlatformDetector()