批量执行多个Jupyter Notebook时,如何将日志统一写入同一文件?
嘿,这个问题其实很好解决~核心就是让所有Notebook共享同一个日志写入的入口,要么用Python标准库的logging模块统一管理,要么直接指定同一个日志文件并以追加模式写入就行。下面给你两种实用的实现方案:
方案一:用
logging模块统一管理日志(推荐) 这种方式更规范,适合长期维护,还能方便地调整日志级别、格式,避免重复配置。
步骤1:在主Notebook中配置全局日志
先在你的主Notebook里初始化全局日志设置,指定统一的日志文件、输出格式和级别:
import logging import nbformat from nbconvert.preprocessors import ExecutePreprocessor # 配置全局日志:所有Notebook的日志都会写入这个文件 logging.basicConfig( filename='all_notebooks_combined.log', level=logging.INFO, format='%(asctime)s - %(module)s - %(levelname)s: %(message)s', filemode='a' # 关键:用追加模式,不会覆盖之前的日志 ) # 读取Notebook的函数(保持你的原有逻辑) def read_in_notebook(notebook_fp): with open(notebook_fp) as f: nb = nbformat.read(f, as_version=4) return nb # 执行Notebook的函数,加入日志记录 def execute_notebook(notebook_fp): # 记录执行开始 logging.info(f"===== 开始执行Notebook: {notebook_fp} =====") nb = read_in_notebook(notebook_fp) ep = ExecutePreprocessor(timeout=600, kernel_name='python3') try: ep.preprocess(nb, {'metadata': {'path': './'}}) logging.info(f"===== Notebook执行成功: {notebook_fp} =====") except Exception as e: logging.error(f"===== Notebook执行失败: {notebook_fp} 错误信息: {str(e)} =====") return nb # 主逻辑:批量执行Notebook notebooks_list = ['notebook_1.ipynb', 'notebook_2.ipynb', 'notebook_3.ipynb'] for nb_path in notebooks_list: execute_notebook(nb_path)
步骤2:子Notebook中复用全局日志
在每个子Notebook里,不需要重新配置日志,直接导入logging模块使用即可:
import logging # 子Notebook中的业务代码 logging.info("子Notebook1:开始处理数据") # ... 你的代码逻辑 ... logging.info("子Notebook1:数据处理完成")
方案二:手动指定统一日志路径(简单直接)
如果不想用logging模块,也可以直接定义一个全局的日志文件路径,所有Notebook都用这个路径以追加模式写入日志。
步骤1:主Notebook中定义统一日志路径和日志函数
import nbformat from nbconvert.preprocessors import ExecutePreprocessor from datetime import datetime # 全局统一日志文件路径 GLOBAL_LOG_FILE = 'all_notebooks.log' def write_log(message): """统一的日志写入函数,确保用追加模式""" timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") with open(GLOBAL_LOG_FILE, 'a', encoding='utf-8') as f: f.write(f"[{timestamp}] {message}\n") def read_in_notebook(notebook_fp): with open(notebook_fp) as f: nb = nbformat.read(f, as_version=4) return nb def execute_notebook(notebook_fp): write_log(f"开始执行Notebook: {notebook_fp}") nb = read_in_notebook(notebook_fp) ep = ExecutePreprocessor(timeout=600, kernel_name='python3') try: ep.preprocess(nb, {'metadata': {'path': './'}}) write_log(f"Notebook执行成功: {notebook_fp}") except Exception as e: write_log(f"Notebook执行失败: {notebook_fp}, 错误: {str(e)}") return nb # 批量执行Notebook for nb_path in ['nb1.ipynb', 'nb2.ipynb']: execute_notebook(nb_path)
步骤2:子Notebook中写入统一日志
在子Notebook里,直接使用同一个日志文件路径,以追加模式写入:
from datetime import datetime # 必须和主Notebook的路径一致 GLOBAL_LOG_FILE = 'all_notebooks.log' def write_log(message): timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") with open(GLOBAL_LOG_FILE, 'a', encoding='utf-8') as f: f.write(f"[{timestamp}] 子Notebook2:{message}\n") # 子Notebook业务代码 write_log("开始加载模型") # ... 你的代码 ... write_log("模型加载完成,开始预测")
注意事项
- 务必用追加模式:所有写入日志的操作都要用
'a'模式打开文件,否则会覆盖之前的日志内容。 - 多线程/进程场景:如果是并行执行Notebook,建议用
logging模块(它自带线程安全),或者手动加文件锁,避免日志内容混乱。 - 路径一致性:如果Notebook在不同目录,建议用绝对路径指定日志文件,避免找不到文件的问题。
内容的提问来源于stack exchange,提问作者mdicamp
相关产品推荐
相关产品推荐

