# 【启动 S1】导入本模块时,文件末尾会调用 setup_logger 创建全局 logger。 # 日志仅记录执行过程;出现“调用成功”等文本仍需结合真实返回内容判断业务结果。 """ 需求:为SmartBizTrip项目创建和配置日志记录器 思路步骤: 1. 导入必要的模块(logging、os、Config) 2. 定义setup_logger函数配置日志记录器 3. 创建日志文件夹(如果不存在) 4. 获取并配置日志记录器(设置级别、防止重复输出) 5. 定义日志格式 6. 创建控制台处理器(输出INFO级别日志) 7. 创建文件处理器(输出DEBUG级别日志) 8. 将处理器添加到日志记录器中(避免重复添加) 9. 初始化并返回配置好的日志记录器 10. 创建项目的全局日志记录器实例 """ import logging import os from config import Config def setup_logger(name, log_file='logs/app.log'): # 创建日志文件夹 # 【日志内部步骤 1】确保日志目录存在,再取得同名 logger 并设置日志级别。 # 输入 name 用于区分日志来源,log_file 指定文件位置;输出配置好的 logging.Logger。 # 调用方以后用 logger.info/debug/error 写日志时,不必每次重新创建文件处理器。 # 先取日志文件的目录再创建;exist_ok=True 允许目录已经存在,不会因此报错。 os.makedirs(os.path.dirname(log_file), exist_ok=True) # 获取日志记录器 logger = logging.getLogger(name) logger.setLevel(logging.DEBUG) # 防止重复输出的关键! # 禁止把消息继续传给更上层 logger,避免本 logger 已输出后,根 logger 又输出同一条。 logger.propagate = False # 定义日志格式 # 格式串里的 name/asctime/levelname/message 由 logging 在写每条记录时填入。 formatter = logging.Formatter('%(name)s - %(asctime)s - %(levelname)s - %(message)s') # 创建控制台处理器 # 【日志内部步骤 2】控制台处理器接收 INFO 及以上级别;日志文件处理器接收 DEBUG 及以上级别。 console_handler = logging.StreamHandler() console_handler.setFormatter(formatter) console_handler.setLevel(logging.INFO) # 消息先通过 logger 级别筛选,再通过 handler 级别筛选 # 创建文件处理器 # mode="a" 表示追加到现有日志,encoding="utf-8" 用于保存中文;不是每次启动清空文件。 file_handler = logging.FileHandler(filename=log_file, encoding="utf-8", mode="a") file_handler.setFormatter(formatter) file_handler.setLevel(logging.DEBUG) # 将处理器添加到日志记录器中 # 【日志内部步骤 3】仅在没有处理器时挂载,避免同一条日志重复输出到多个相同处理器。 if not logger.handlers: # 先进行判断,再进行添加。避免重复添加处理器 logger.addHandler(console_handler) logger.addHandler(file_handler) return logger logger = setup_logger('SmartBizTrip', Config().log_file)