Heroku部署Python Discord机器人出现FileNotFoundError崩溃如何解决
错误根因
报错指向logger.py第30行的日志文件初始化逻辑,Python logging 模块的FileHandler不会自动创建不存在的父目录:
- 你本地开发环境提前手动创建了
logs目录,所以本地运行正常 logs目录通常会被加入.gitignore过滤规则,不会提交到GitHub,Heroku拉取代码部署后根目录下没有logs文件夹,创建日志文件时就触发了FileNotFoundError
可选解决方案
- 方案一:运行时自动创建日志目录
修改utils/logger.py的init方法,在实例化FileHandler前添加目录创建逻辑:
import os # 下方代码放在 log_file = logging.FileHandler(...) 之前执行 os.makedirs('logs', exist_ok=True)
exist_ok=True参数可兼容本地已存在logs目录的场景,不会重复创建报错。
- 方案二:适配Heroku运行逻辑,移除本地文件日志输出
Heroku的dyno自带日志收集能力,会自动捕获所有输出到stdout/stderr的内容,你可以直接修改日志配置,删掉FileHandler相关逻辑,只保留向控制台输出的StreamHandler即可。
注意:Heroku的文件系统是临时存储,dyno重启、重新部署、24小时自动轮转时都会清空所有本地写入的文件,就算你创建了logs目录写入日志,也会随时丢失,方案二是最适配Heroku平台的处理方式。
- 方案三:提交logs目录到Git仓库
在本地项目根目录的logs文件夹下新建一个空的.gitkeep文件,修改.gitignore规则,将原来屏蔽logs目录的规则改为只屏蔽日志文件:
# 原规则如果是 logs/ 就改成下面的 /logs/*.log
之后把logs目录和.gitkeep提交到GitHub,重新部署到Heroku就会自动生成logs目录。
内容的提问来源于stack exchange,提问作者blop5316
相关产品推荐
相关产品推荐

