使用 logging 模块生成 .log 文件
在 Python 中,使用 logging 模块生成 .log 文件非常简单。你需要为你的 logger 添加一个 FileHandler,并将其指向你想要的文件名(例如 my_app.log)。
以下是如何修改代码,使其既能输出到控制台又能输出到 .log 文件:
代码示例
import logging# 1. 获取 Logger (使用你已有的这行)
logger = logging.getLogger('CNNModel_YoloSeg')# 2. 配置 Logger (通常在程序启动时做一次)
if not logger.handlers: # 防止重复添加 Handlerlogger.setLevel(logging.DEBUG) # 记录 DEBUG 及以上级别的日志# --- 创建并配置控制台 Handler (可选,用于实时查看) ---console_handler = logging.StreamHandler()console_handler.setLevel(logging.INFO) # 控制台只显示 INFO 及以上# --- 创建并配置文件 Handler (这是生成 .log 文件的关键!) ---# 指定日志文件的名称,例如 'cnn_yolo_seg.log'log_filename = 'cnn_yolo_seg.log' file_handler = logging.FileHandler(log_filename, mode='a', encoding='utf-8') # mode='a' 表示追加 (append),'w' 表示每次覆盖 (overwrite)# encoding='utf-8' 确保能正确处理中文等字符file_handler.setLevel(logging.DEBUG) # 文件记录所有 DEBUG 及以上日志# --- 创建 Formatter (定义日志的格式) ---# 你可以自定义格式,这里包含时间、Logger名、级别和消息formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')# 常见的格式化字符串:# %(asctime)s : 可读的时间戳 (如 2025-08-28 10:55:30,123)# %(name)s : Logger 的名字 (这里是 'CNNModel_YoloSeg')# %(levelname)s: 日志级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL)# %(message)s : 实际的日志消息# %(filename)s: 发出日志的文件名# %(funcName)s: 发出日志的函数名# %(lineno)d : 发出日志的行号# 将 Formatter 分别设置给 Handlerconsole_handler.setFormatter(formatter)file_handler.setFormatter(formatter)# --- 将 Handler 添加到 Logger ---logger.addHandler(console_handler) # 输出到控制台logger.addHandler(file_handler) # 输出到文件 (.log 文件!)# 3. 在代码中使用 Logger 记录日志
def train_model():logger.info("开始训练 YOLO Segmentation 模型...")try:# ... 模拟一些操作 ...logger.debug("正在加载训练数据集...")logger.info("成功加载 1000 个训练样本。")# ... 模拟训练 ...logger.warning("学习率较高,可能导致不稳定。")# ... 模拟完成 ...logger.info("模型训练完成。")except Exception as e:logger.error("训练过程中发生致命错误: %s", str(e), exc_info=True)raise# 4. 调用函数,这将生成日志
if __name__ == "__main__":train_model()
关键点解释
- FileHandler:
- logging.FileHandler(filename, mode=‘a’, encoding=‘utf-8’) 是创建文件处理器的核心。
- filename: 你想要生成的 .log 文件的路径和名称。可以是相对路径(如 ‘logs/my_app.log’)或绝对路径。
- mode: ‘a’ (追加) 是最常用的,这样每次运行程序时,新的日志会添加到文件末尾。‘w’ 会覆盖旧文件。
- encoding: 指定文件编码,推荐使用 ‘utf-8’ 以支持中文和其他字符。
- addHandler(file_handler): 这行代码将文件处理器添加到 Logger。只有添加了 Handler,Logger 才会把日志输出到相应的目标(文件或控制台)。
- if not logger.handlers:: 这是一个重要的检查。当你在多个地方导入这个模块时,如果每次都执行 addHandler,会导致日志消息被重复输出(例如,控制台出现多次)。这个检查确保 Handler 只被添加一次。
- 运行脚本: 当你运行这个 Python 脚本时,除了在控制台看到 INFO 级别的日志外,还会在脚本所在的目录下生成一个名为 cnn_yolo_seg.log 的文件。这个文件会包含所有 DEBUG 级别及以上的日志消息(因为 file_handler 的级别是 DEBUG),格式由 Formatter 定义。