跳转到内容
无痕工具库 无痕工具库

Node.js 应用中 stderr.log 空文件详解 | Hostinger 教程

在排查 Node.js 应用问题时,用户通常会依赖日志来了解出了什么问题。一个常见的困惑点是 stderr.log 文件是空的。这会让人不确定应用是否正常运行,或者下一步该从哪里排查。

本文将说明:

  • 为空的 stderr.log 实际上意味着什么
  • 构建日志、运行时日志与 stderr.log 之间的区别
  • stderr.log 为空的常见原因
  • 调试时接下来应采取的步骤

日志类型说明

在深入问题之前,先区分三种主要日志类型非常重要:

1. 构建日志(Build Logs)

Hostinger 部署构建日志显示 npm 依赖安装失败

  • 在构建阶段生成(例如依赖安装、编译)
  • 通常包含 npm install 或 npm run build 等命令的输出
  • 这里的错误会导致应用无法构建或部署

2. 运行时日志(stdout)

Hostinger 网站控制面板,已选择 Runtime logs 菜单项,未找到任何日志

  • 在应用运行时生成
  • 包含 console.log() 输出以及常规的应用活动
  • 大多数应用级日志默认出现在这里

3. stderr.log

文件浏览器显示 nodejs 文件夹,其中 stderr.log 已高亮

  • 捕获错误输出(stderr 流)
  • 包含未捕获的异常、系统级错误,或任何通过 console.error() 写入的内容
  • 并非所有错误都会自动记录到这里

关键要点: 并非所有错误都会出现在 stderr.log 中。许多 Node.js 应用会将错误记录到 stdout 中。

为空的 stderr.log 意味着什么?

为空的 stderr.log 不一定意味着没有出现问题。

它通常表示以下情况之一:

1. 应用从未完全启动

如果应用在初始化之前就失败了:

  • 日志系统可能尚未激活
  • 没有任何输出写入 stderr.log

常见原因:

  • 入口点缺失或无效(例如启动脚本错误)
  • 语法错误导致无法执行
  • 依赖缺失

2. 错误被记录到 stdout 而非 stderr

在 Node.js 中:

  • console.log() → stdout
  • console.error() → stderr

然而,许多框架和库:

  • 使用 console.log() 记录错误
  • 或使用将所有内容都写入 stdout 的自定义日志器

结果:

错误确实存在,但 stderr.log 仍然为空。

3. 环境变量缺失或不正确

如果所需的环境变量未加载:

  • 应用可能会提前退出
  • 不会写入任何日志(或只有极少的输出)

示例:

  • 缺少 PORT
  • 缺少数据库凭据
  • .env 文件配置错误

4. 进程静默退出

某些应用:

  • 在内部捕获错误
  • 不记录任何信息就退出

这种情况可能发生在:

  • 错误处理不完整
  • 日志配置不当

接下来该检查什么

如果 stderr.log 为空,请按以下步骤操作:

1. 先检查运行时日志

Hostinger 网站控制面板,已选择 Runtime logs 菜单项,未找到任何日志

查看主要的运行时日志(stdout):

  • 搜索错误、警告或异常退出。如果错误信息不明确:

    • 查找进程停止前的最后一行日志
    • 检查是否缺少启动确认消息
    • 如果日志看起来正常,排查特定的路由或请求
    • 添加显式错误处理器(见第 5 步)
  • 查找堆栈跟踪或启动消息

在大多数情况下,相关的错误会出现在这里,而不是 stderr.log 中。

2. 验证应用是否成功启动

确认应用确实已启动:

    • Server running on port…

    • Listening on…

      查找类似这样的消息:

如果缺少这些消息:

  • 应用很可能在启动过程中失败了

3. 验证环境变量

确保所有必需的环境变量都已存在:

  • 检查 .env 文件(如果使用了的话)
  • 确认变量已在你的环境中正确加载

你可以临时添加调试代码:

console.log(process.env);

如果你在运行时日志中看到 injecting env (0) from .env,这不是错误。(0) 仅表示从 .env 文件加载了零个变量——要么是因为该文件在服务器上不存在,要么是文件为空。这是正常现象,因为 .env 文件通常不会随部署一起上传。

Hostinger 会通过控制面板将环境变量直接注入到进程中。不过,这条消息本身并不能确认你在 Hostinger 控制面板中设置的变量已成功加载——这是两个独立的机制。要验证你的变量在运行时确实可用,请查看 console.log(process.env) 的输出,并查找你期望的键(例如数据库凭据、API 密钥)。你还可以输出 Object.keys(process.env).length 来查看存在多少个变量。

4. 检查启动命令

检查你的 package.json:

"scripts": { "start": "node app.js" }

确保:

  • 使用了正确的入口文件
  • 没有拼写错误或文件缺失

5. 添加显式错误日志

要确保错误出现在 stderr.log 中,请使用:

process.on('uncaughtException', (err) => { console.error('Uncaught Exception:', err); }); process.on('unhandledRejection', (err) => { console.error('Unhandled Rejection:', err); });

6. 确认日志文件路径

根据你的设置,日志通常存储在:

domains/[your-domain]/nodejs/stderr.log

常见文件包括:

  • stdout.log → 运行时日志
  • stderr.log → 错误日志

请确保:

  • 你检查的是正确的目录
  • 应用拥有写入日志的权限

注意