| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- #!/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
|