初始化并返回一个日志记录器。 该函数确保所有日志记录器共享相同的处理程序,包括: - 基于时间戳的日志文件 - latest.log 文件 - 控制台输出(带颜色) 参数: - logger_name: 日志记录器的名称 - level: 日志级别,默认为 logging.INFO 返回: - logger: 配置好的日志记录器
(logger_name, level=logging.INFO)
| 39 | return message |
| 40 | |
| 41 | def setup_logger(logger_name, level=logging.INFO): |
| 42 | ''' |
| 43 | 初始化并返回一个日志记录器。 |
| 44 | |
| 45 | 该函数确保所有日志记录器共享相同的处理程序,包括: |
| 46 | - 基于时间戳的日志文件 |
| 47 | - latest.log 文件 |
| 48 | - 控制台输出(带颜色) |
| 49 | |
| 50 | 参数: |
| 51 | - logger_name: 日志记录器的名称 |
| 52 | - level: 日志级别,默认为 logging.INFO |
| 53 | |
| 54 | 返回: |
| 55 | - logger: 配置好的日志记录器 |
| 56 | ''' |
| 57 | logger = logging.getLogger(logger_name) |
| 58 | logger.setLevel(level) |
| 59 | logger.propagate = True # 确保日志传递到根记录器 |
| 60 | |
| 61 | # 检查根记录器是否已配置处理程序 |
| 62 | if not logging.getLogger().hasHandlers(): |
| 63 | # 获取主脚本的路径 |
| 64 | main_script = sys.argv[0] |
| 65 | if not main_script: |
| 66 | # 在某些环境下(如交互式解释器),sys.argv[0] 可能为空 |
| 67 | main_script_dir = os.getcwd() |
| 68 | main_script_name = 'unknown' |
| 69 | else: |
| 70 | main_script_path = os.path.abspath(main_script) |
| 71 | main_script_dir = os.path.dirname(main_script_path) |
| 72 | main_script_name = os.path.splitext(os.path.basename(main_script_path))[0] |
| 73 | |
| 74 | # 创建日志目录:{主脚本目录}/logs/{主脚本名称}/ |
| 75 | log_dir = os.path.join('logs', main_script_name) |
| 76 | os.makedirs(log_dir, exist_ok=True) |
| 77 | |
| 78 | # 生成基于时间戳的日志文件名 |
| 79 | timestamp = time.strftime("%Y%m%d_%H%M%S", time.localtime()) |
| 80 | timestamp_log_file = os.path.join(log_dir, f'{timestamp}.log') |
| 81 | |
| 82 | # 定义 latest.log 文件路径 |
| 83 | latest_log_file = os.path.join(log_dir, 'latest.log') |
| 84 | |
| 85 | # 定义日志格式 |
| 86 | formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') |
| 87 | |
| 88 | # 定义带颜色的日志格式化器 |
| 89 | colored_formatter = ColoredFormatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') |
| 90 | |
| 91 | # 处理程序1:基于时间戳的日志文件(带轮转) |
| 92 | timestamp_handler = RotatingFileHandler( |
| 93 | timestamp_log_file, |
| 94 | maxBytes=1000*1024*1024, # 1000 MB |
| 95 | backupCount=5, |
| 96 | encoding='utf-8' |
| 97 | ) |
| 98 | timestamp_handler.setFormatter(formatter) |