Files
nl-tools/core/logger.py
2025-12-11 09:47:00 +08:00

92 lines
2.5 KiB
Python

"""
日志配置模块
- 日志文件: logs/app_YYYYMMDD.log
- 日志格式: [时间] [级别] [模块] 消息
- 自动清理30天前的旧日志
"""
import os
import logging
import datetime
from pathlib import Path
def get_logs_dir() -> Path:
"""获取日志目录路径"""
# 获取应用根目录
app_root = Path(__file__).parent.parent
logs_dir = app_root / "logs"
logs_dir.mkdir(exist_ok=True)
return logs_dir
def get_log_file_path() -> Path:
"""获取当天的日志文件路径"""
today = datetime.date.today().strftime("%Y%m%d")
return get_logs_dir() / f"app_{today}.log"
def setup_logging():
"""配置日志系统"""
log_file = get_log_file_path()
# 日志格式
log_format = "[%(asctime)s] [%(levelname)s] [%(name)s] %(message)s"
date_format = "%Y-%m-%d %H:%M:%S"
# 配置根日志器
logging.basicConfig(
level=logging.DEBUG,
format=log_format,
datefmt=date_format,
handlers=[
# 文件处理器
logging.FileHandler(log_file, encoding="utf-8"),
# 控制台处理器
logging.StreamHandler()
]
)
# 记录启动日志
logging.info("=" * 50)
logging.info("奶酪云工具箱 启动")
logging.info("=" * 50)
# 清理旧日志
cleanup_old_logs()
def cleanup_old_logs(days: int = 30):
"""清理指定天数前的旧日志"""
logs_dir = get_logs_dir()
cutoff_date = datetime.date.today() - datetime.timedelta(days=days)
for log_file in logs_dir.glob("app_*.log"):
try:
# 从文件名提取日期
date_str = log_file.stem.replace("app_", "")
file_date = datetime.datetime.strptime(date_str, "%Y%m%d").date()
if file_date < cutoff_date:
log_file.unlink()
logging.info(f"已清理旧日志文件: {log_file.name}")
except (ValueError, OSError) as e:
logging.warning(f"清理日志文件失败 {log_file}: {e}")
def get_all_log_files() -> list:
"""获取所有日志文件列表(按时间倒序)"""
logs_dir = get_logs_dir()
log_files = list(logs_dir.glob("app_*.log"))
log_files.sort(key=lambda x: x.name, reverse=True)
return log_files
def read_log_file(file_path: Path) -> str:
"""读取日志文件内容"""
try:
with open(file_path, "r", encoding="utf-8") as f:
return f.read()
except Exception as e:
return f"读取日志文件失败: {e}"