| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- # 【启动 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)
|