feat: 日志日期分片和尺寸解析增强

- 日志文件按日期分片存储 (logs/YYYY-MM/YYYY-MM-DD.log)
- 增强尺寸箱量解析支持多种格式 (*和×分隔符)
- 支持带括号和无括号两种尺寸格式
This commit is contained in:
2026-01-04 01:19:07 +08:00
parent 5fd05fcd3c
commit 84e907b93e
3 changed files with 778 additions and 19 deletions

View File

@@ -2,11 +2,13 @@
"""
统一日志配置模块
提供统一的日志配置,避免各模块自行配置
支持按日期分片存储日志
"""
import os
import logging
import sys
from logging.handlers import RotatingFileHandler
from datetime import datetime
from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler
from typing import Optional
from src.config import config
@@ -16,6 +18,8 @@ def setup_logging(
log_file: Optional[str] = None,
console_level: int = logging.INFO,
file_level: int = logging.DEBUG,
use_date_split: bool = True,
date_folder_format: str = "%Y-%m", # 按月份分文件夹
max_bytes: int = 10 * 1024 * 1024, # 10MB
backup_count: int = 5
) -> logging.Logger:
@@ -26,21 +30,31 @@ def setup_logging(
log_file: 日志文件路径如果为None则使用默认路径
console_level: 控制台日志级别
file_level: 文件日志级别
use_date_split: 是否使用日期分片
date_folder_format: 日期文件夹格式(默认按月份,如 logs/2025-12/
max_bytes: 单个日志文件最大大小
backup_count: 备份文件数量
返回:
配置好的根日志器
"""
# 创建日志目录
# 获取当前日期用于构建路径
now = datetime.now()
if log_file is None:
log_dir = 'logs'
log_file = os.path.join(log_dir, 'app.log')
if use_date_split:
# 按日期分片logs/2025-12/2025-12-30.log
date_folder = now.strftime(date_folder_format)
log_dir = os.path.join('logs', date_folder)
log_file = os.path.join(log_dir, now.strftime('%Y-%m-%d.log'))
else:
log_file = os.path.join(log_dir, 'app.log')
else:
log_dir = os.path.dirname(log_file)
if log_dir and not os.path.exists(log_dir):
os.makedirs(log_dir)
os.makedirs(log_dir, exist_ok=True)
# 获取根日志器
logger = logging.getLogger()
@@ -59,13 +73,28 @@ def setup_logging(
console_handler.setFormatter(console_formatter)
logger.addHandler(console_handler)
# 文件handler轮转
file_handler = RotatingFileHandler(
log_file,
maxBytes=max_bytes,
backupCount=backup_count,
encoding='utf-8'
)
# 文件handler日期分片或大小轮转)
if use_date_split:
# 使用TimedRotatingFileHandler每天午夜轮转
file_handler = TimedRotatingFileHandler(
log_file,
when='midnight',
interval=1,
backupCount=backup_count,
encoding='utf-8',
atTime=datetime.strptime('00:00:00', '%H:%M:%S')
)
logger.info(f"日志系统已初始化,使用日期分片: {log_file}")
else:
# 使用RotatingFileHandler按大小轮转
file_handler = RotatingFileHandler(
log_file,
maxBytes=max_bytes,
backupCount=backup_count,
encoding='utf-8'
)
logger.info(f"日志系统已初始化,使用大小轮转: {log_file}")
file_handler.setLevel(file_level)
file_formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s',
@@ -78,7 +107,6 @@ def setup_logging(
logging.getLogger('urllib3').setLevel(logging.WARNING)
logging.getLogger('requests').setLevel(logging.WARNING)
logger.info(f"日志系统已初始化,日志文件: {log_file}")
logger.info(f"控制台日志级别: {logging.getLevelName(console_level)}")
logger.info(f"文件日志级别: {logging.getLevelName(file_level)}")