如何通过PM2查看Debian服务器上Node.js应用的日志?
问题排查指南:PM2无应用日志 + MongoDB写入失败
看起来你遇到了两个关联的问题:PM2捕获不到应用的日志输出,同时MongoDB数据写入无反应。结合你提供的PM2日志和进程列表,咱们一步步来拆解问题:
一、为什么PM2看不到应用日志?
从你的PM2日志来看,只有PM2自身的进程管理日志(比如启动、停止、进程ID变化),完全没有你的Node.js应用的输出——这说明你的应用没有把日志输出到标准输出(stdout)或标准错误流(stderr),而PM2默认只会捕获这两个流的内容。
可能的原因和解决办法:
- 应用错误未被捕获输出:你的MongoDB写入逻辑可能没有错误处理,即使失败也没把错误打印出来。修改代码,在数据库操作的回调里强制输出错误:
const db = require('mongojs')('你的数据库地址', ['目标集合']); db.目标集合.insert(你的数据, (err, res) => { if (err) { // 强制把错误输出到stderr,PM2会捕获到 console.error('[MongoDB错误] 写入失败:', err); return; } console.log('[MongoDB成功] 数据写入:', res); }); - 自定义日志库未配置控制台输出:如果你的应用用了Winston、Bunyan这类日志库,默认可能只写文件不输出到控制台。需要添加Console transport:
const winston = require('winston'); const logger = winston.createLogger({ transports: [ new winston.transports.Console(), // 必须加这个,让日志输出到控制台 new winston.transports.File({ filename: 'app.log' }) ] }); - PM2日志路径未正确读取:试试直接查看PM2的日志文件,执行
pm2 show app,找到out log path和error log path,用cat命令查看文件内容,比如:cat /home/your-user/.pm2/logs/app-out.log cat /home/your-user/.pm2/logs/app-error.log
二、MongoDB数据写入失败的排查方向
结合应用无日志的情况,大概率是数据库操作出错但没被记录,常见原因:
- 数据库连接配置错误:检查应用里的MongoDB连接字符串,比如是不是用了
localhost但服务器上的MongoDB绑定了内网IP?或者缺少认证信息?
你可以在服务器上手动测试连接:mongo mongodb://你的数据库地址 # 测试插入数据 > db.你的集合.insert({test: 'debug-data'}) > db.你的集合.find() - 权限不足:PM2运行应用的用户(你的
user账户)有没有MongoDB的写入权限?或者目标数据库/集合不存在,而mongojs没有自动创建的配置? - 环境变量不一致:PM2运行的环境变量和你本地
node app.js的环境变量可能不一样。执行pm2 env app查看服务器上的环境变量,对比本地的环境变量(比如process.env.MONGODB_URL),确保数据库地址等配置完全一致。
三、本地运行node app.js的注意事项
要重现服务器上的问题,本地运行时要模拟服务器环境:
- 先设置和服务器相同的环境变量,比如:
export MONGODB_URL="mongodb://服务器IP:27017/你的数据库" - 运行时确保控制台能看到所有输出,不要重定向到文件。如果应用有静默输出的配置,记得临时关闭。
内容的提问来源于stack exchange,提问作者HelpASisterOut
相关产品推荐
相关产品推荐

