#!/usr/bin/env python # -*- coding: utf-8 -*- import sys from pathlib import Path from loguru import logger # Global logger instance app_logger = None def setup_logger(log_dir, log_retention_days=7, log_rotation="1 day", debug_mode=False): """ Create a logger instance Parameters: log_dir (str): 日志目录 log_retention_days (int): 日志保留天数 log_rotation (str): 日志轮转间隔 debug_mode (bool): 是否开启调试模式 """ global app_logger try: logger.remove() log_level = "DEBUG" if debug_mode else "INFO" console_format = ( "{time:HH:mm:ss} | {level: <8} | {message}" if not debug_mode else "{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | " "{name}:{function}:{line} | {message}" ) logger.add(sys.stderr, level=log_level, format=console_format, colorize=True) if debug_mode: log_path = Path(log_dir) log_path.mkdir(parents=True, exist_ok=True) log_file = log_path / "{time:YYYY-MM-DD}.log" file_format = "{time:YYYY-MM-DD HH:mm:ss.SSS} | {level: <8} | {name}:{function}:{line} | {message}" logger.add( str(log_file), level=log_level, format=file_format, rotation=log_rotation, retention=f"{log_retention_days} days", encoding="utf-8", compression="zip", enqueue=True, catch=True, ) app_logger = logger return logger except Exception as e: logger.remove() logger.add(sys.stderr, level="ERROR") logger.error(f"日志系统配置失败: {e}") raise def get_logger(): """Get the logger instance""" global app_logger if app_logger is None: # 如果没有设置过logger,使用默认配置 logger.remove() # 移除所有现有处理器 logger.add(sys.stderr, level="INFO", format="{time:YYYY-MM-DD HH:mm:ss.SSS} | {level: <8} | {name}:{function}:{line} | {message}") app_logger = logger return app_logger if __name__ == "__main__": """Test the logger""" import tempfile with tempfile.TemporaryDirectory() as temp_dir: try: setup_logger(temp_dir, debug_mode=True) logger.debug("这是一条调试日志") logger.info("这是一条信息日志") logger.warning("这是一条警告日志") logger.error("这是一条错误日志") logger.critical("这是一条严重日志") try: 1 / 0 except ZeroDivisionError: logger.exception("发生了除零异常") print("✅ 日志测试完成") logger.remove() except Exception as e: print(f"❌ 日志测试失败: {e}") logger.remove() raise