Node/Koa后端部署至Heroku后日志出现‘Undefined’排查求助
排查Heroku上Koa应用日志中
undefined记录的思路 我来帮你梳理下这个莫名出现的undefined日志的排查方向,这类问题大多是代码里的无意识输出或者变量未初始化导致的,咱们一步步来定位:
检查代码中的
console.log语句
先全局搜索项目里所有的console.log,重点看这几种情况:- 有没有空的
console.log()调用,这种会直接输出undefined; - 有没有
console.log(someVariable)但someVariable在某些场景下未赋值的情况,比如在中间件里打印一个可能不存在的请求参数、或者未初始化的配置项; - 尤其要留意Koa的请求日志中间件(比如
koa-logger),如果自己做了定制化修改,可能不小心输出了undefined的值。
- 有没有空的
排查第三方依赖的日志输出
有时候这个undefined可能不是你的代码输出的,而是某个依赖包的日志:- 可以尝试临时移除一些非核心的中间件(比如监控、日志增强类的包),重新部署到Heroku,看
undefined是否消失,逐步缩小范围; - 查看最近新增或更新的依赖,有可能是新版本的包引入了日志输出问题。
- 可以尝试临时移除一些非核心的中间件(比如监控、日志增强类的包),重新部署到Heroku,看
本地复现并调试
- 在本地用和Heroku一致的命令启动服务(也就是
npm start),观察本地控制台是否也出现这个undefined。如果本地也有,直接用Node的调试工具(比如node inspect server.js)或者在IDE里加断点,跟踪输出的来源; - 如果本地没有,那大概率是Heroku环境的差异导致的,比如某个环境变量未设置,代码里读取
process.env.XXX得到undefined并被打印了,可以检查Heroku后台的环境变量配置。
- 在本地用和Heroku一致的命令启动服务(也就是
用全局日志捕获定位来源
如果上面的方法都没找到,可以在server.js最开头添加一段代码,给console.log加个包装,捕获输出undefined时的调用栈:const originalLog = console.log; console.log = function(...args) { if (args.includes(undefined)) { originalLog('=== 触发undefined的调用栈 ==='); originalLog(new Error().stack); } originalLog.apply(console, args); };重新部署后,日志里会显示这个
undefined是从哪行代码、哪个函数里输出的,直接精准定位问题。
内容的提问来源于stack exchange,提问作者chadhamre
相关产品推荐
相关产品推荐

