在 Ubuntu 上运行 Node.js 时日志“丢失”,通常不是真的消失了,而是输出方式、系统配置或进程管理导致日志没有到达你预期的位置。下面按最常见原因 → 排查方法 → 解决方案来说明。
console.log 被 systemd / 容器吞掉如果你用 systemd 或 Docker 启动 Node.js:
console.log('hello')
✅ 实际是写到了 stdout
❌ 但你没去正确的地方看
journalctl -u your-service-name -f
Node 的 console.log 会进 journald,不会写文件。
/dev/null常见于:
node app.js > /dev/null 2>&1
或 systemd 配置:
StandardOutput=null
✅ 日志直接丢弃
✅ 解决:
StandardOutput=journal
StandardError=journal
例如:
fs.writeFileSync('/var/log/app.log', data)
但:
/var/log 需要 root"logs/app.log"✅ 排查:
pwd
ls -l logs/
✅ 解决:
sudo chown -R $(whoami) /var/log/app
Node 是 异步 的:
console.log('start')
process.exit(1)
有些日志可能 还没 flush
✅ 解决:
process.on('exit', () => {
console.log('exit')
})
或使用日志库(见下文)
如果你用 PM2:
pm2 logs
日志默认在:
~/.pm2/logs/
❌ 不是你代码里写的文件
Docker 中:
console.log('xxx')
✅ 在容器 stdout
❌ 但你没看 docker logs
docker logs 容器名
✅ 或挂载 volume:
-v /host/logs:/app/logs
你可以按顺序检查:
Node 是怎么启动的?
node app.js?日志是写到哪里的?
console.logfs.writeFilewinston / pino有没有重定向?
ps aux | grep node
有没有权限?
ls -ld 日志目录
const winston = require('winston')
const logger = winston.createLogger({
transports: [
new winston.transports.File({ filename: 'app.log' }),
new winston.transports.Console()
]
})
logger.info('this will not lost')
✅ 自动 flush
✅ 支持按天切分
✅ 支持 systemd / docker
[Service]
ExecStart=/usr/bin/node /app/app.js
StandardOutput=journal
StandardError=journal
查看:
journalctl -u app -f
Node.js 在 Ubuntu 上“日志丢失”,99% 是 stdout 没被接住、路径不对、权限不足或进程异常退出。
如果你愿意,可以把下面信息发我,我可以精确告诉你原因: