在 Linux 上 Node.js 程序“日志不输出”是很常见的问题,通常不是 Node 本身没打日志,而是输出被重定向、缓冲、或进程方式导致你看不到。下面按最常见原因逐一说明。
你可能是这样启动的:
node app.js > /dev/null 2>&1 &
或
nohup node app.js > out.log 2>&1 &
结果:
console.log 写到了文件✅ 解决:
tail -f out.log
pm2systemddockernohup这些环境:
✅ 示例:
pm2 logs
journalctl -u your-service
docker logs container_id
Node.js 在非 TTY(非终端)环境下:
例如:
node app.js | tee log.txt
可能几秒甚至几分钟才看到一次日志。
✅ 解决方式:
process.stdout.write检查:
console.log('start') // 是否真的运行到这里?
常见坑:
if 里没进✅ 调试:
node app.js
不要后台运行,直接看终端
async function main() {
throw new Error('oops')
}
main()
如果你没:
process.on('unhandledRejection', e => {
console.error(e)
})
错误可能“无声消失”。
例如 winston:
const logger = winston.createLogger({})
// 没加 transports,啥都不输出
✅ 正确示例:
winston.add(new winston.transports.Console())
如果你用:
[Service]
ExecStart=/usr/bin/node /app/app.js
日志在:
journalctl -u your-service -f
而不是终端。
请你按顺序确认:
& / nohup / pm2)✅ 直接使用日志库:
import pino from 'pino'
const logger = pino()
logger.info('server started')
✅ 不要依赖 console.log 做生产日志
如果你愿意,可以贴:
我可以直接帮你定位是哪一条原因。