#!/usr/bin/env python # -*- coding: utf-8 -*- """ 日志模块 - 按天生成独立日志文件 """ import logging import os from datetime import datetime from typing import Optional BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) LOG_DIR = os.path.join(BASE_DIR, "logs") def get_logger(name: str = "sync") -> logging.Logger: """ 获取日志记录器 每次调用都检查日期,确保正确切换 Args: name: 日志记录器名称 Returns: 日志记录器实例 """ today: str = datetime.now().strftime("%Y-%m-%d") # 不再缓存 logger,每次都重新创建,避免日期切换问题 logger: logging.Logger = logging.getLogger(name) logger.setLevel(logging.INFO) logger.propagate = False # 清除所有 handlers logger.handlers.clear() os.makedirs(LOG_DIR, exist_ok=True) # 按天生成日志文件:sync-2026-03-05.log log_file: str = os.path.join(LOG_DIR, f"{name}-{today}.log") # 文件处理器 try: file_handler: logging.FileHandler = logging.FileHandler( log_file, encoding="utf-8" ) except OSError as e: raise RuntimeError(f"无法创建日志文件 {log_file}: {e}") from e file_handler.setLevel(logging.INFO) # 控制台处理器 console_handler: logging.StreamHandler = logging.StreamHandler() console_handler.setLevel(logging.INFO) # 格式化器 formatter: logging.Formatter = logging.Formatter( "%(asctime)s - %(name)s - %(levelname)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S" ) file_handler.setFormatter(formatter) console_handler.setFormatter(formatter) logger.addHandler(file_handler) logger.addHandler(console_handler) return logger def clean_old_logs(days: int = 30) -> int: """ 清理超过指定天数的旧日志文件 Args: days: 保留天数 Returns: 删除的文件数量 """ deleted_count: int = 0 try: if not os.path.exists(LOG_DIR): return 0 now: datetime = datetime.now() for filename in os.listdir(LOG_DIR): if not filename.endswith(".log"): continue filepath: str = os.path.join(LOG_DIR, filename) try: file_mtime: datetime = datetime.fromtimestamp( os.path.getmtime(filepath) ) file_age: int = (now - file_mtime).days if file_age > days: os.remove(filepath) deleted_count += 1 print(f"已删除旧日志: {filename}") except OSError as e: print(f"删除日志文件失败 {filename}: {e}") except Exception as e: print(f"清理日志失败: {e}") return deleted_count