You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批量执行多个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("模型加载完成,开始预测")

注意事项

  1. 务必用追加模式:所有写入日志的操作都要用'a'模式打开文件,否则会覆盖之前的日志内容。
  2. 多线程/进程场景:如果是并行执行Notebook,建议用logging模块(它自带线程安全),或者手动加文件锁,避免日志内容混乱。
  3. 路径一致性:如果Notebook在不同目录,建议用绝对路径指定日志文件,避免找不到文件的问题。

内容的提问来源于stack exchange,提问作者mdicamp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:40:21