为什么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
相关产品推荐
相关产品推荐

