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

为什么Python程序运行产生的错误未被写入指定日志文件?

问题原因

  • 文件名不匹配:代码中logging.basicConfig配置的日志文件名为log.text,和你预期查看的log.txt/logfile.txt不一致,属于常见笔误。
  • 日志缓冲区未刷新:默认文件日志是带缓冲区的,你捕获异常打日志后立刻raise终止程序,缓冲区内容还没来得及写入磁盘,就跟着进程退出被清理了。
  • 多进程日志写入冲突:multiprocessing.Pool的子进程和主进程同时写同一个日志文件时,logging模块原生不支持进程安全,可能出现内容丢失、写入失败的问题。

修复方案

快速修复(适配你当前的代码逻辑)

直接修改配置,解决文件名和缓冲区问题,即可实现预期的日志写入效果,修改后的代码如下:

import logging
from multiprocessing import Pool, cpu_count

# 修正文件名为你预期的log.txt,配置行缓冲确保日志即时写入
logging.basicConfig(
    filename='log.txt', 
    level=logging.DEBUG, 
    format='%(asctime)s %(levelname)s %(name)s %(message)s'
)
# 手动给文件handler开启行缓冲,避免日志滞留在缓冲区
for handler in logging.root.handlers:
    if isinstance(handler, logging.FileHandler):
        handler.stream.close()
        handler.stream = open(handler.baseFilename, handler.mode, buffering=1, encoding='utf-8')

logger = logging.getLogger(__name__)

# 以下是你的原有业务函数
def get_mp_list():
    # 原有获取列表逻辑
    pass

def process_mp(mp_item):
    # 原有业务逻辑,包含数据库操作
    pass

def main():
    mp_list = get_mp_list()
    pool = Pool(min(cpu_count(), len(mp_list)))
    results = pool.imap_unordered(process_mp, mp_list)
    while True:
        try:
            result = next(results)
        except StopIteration:
            break
        except Exception as err:
            # 用logger.exception替代logger.error,会自动打印异常栈,排查问题更方便
            logger.exception(err)
            raise

if __name__ == '__main__':
    main()

长期多进程场景最佳实践

如果你的程序长期使用多进程架构,推荐用QueueHandler+QueueListener的方案,所有子进程把日志发送到主进程的队列,由主进程统一写文件,彻底避免多进程写入冲突,稳定性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:27:01