feat: 日志日期分片和尺寸解析增强
- 日志文件按日期分片存储 (logs/YYYY-MM/YYYY-MM-DD.log) - 增强尺寸箱量解析支持多种格式 (*和×分隔符) - 支持带括号和无括号两种尺寸格式
This commit is contained in:
@@ -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)}")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user