在 Linux 上 Node.js 日志“异常”通常不是 Node 本身的 bug,而是环境、配置或行为差异导致的。下面按最常见原因 → 对应现象 → 解决方案来系统说明。
在 Linux 中:
console.log → stdoutconsole.error → stderr如果你用 pm2 / systemd / docker 启动,日志并不会自动写文件。
✅ 现象
✅ 解决
const fs = require('fs');
fs.appendFileSync('app.log', msg);
或使用日志库:
const winston = require('winston');
StandardOutput=journal
StandardError=journal
✅ 日志在:
journalctl -u your-service -f
✅ 解决
StandardOutput=append:/var/log/app.log
StandardError=append:/var/log/app-error.log
pm2 默认接管日志
pm2 logs
pm2 logs app
✅ 日志位置
~/.pm2/logs/
✅ 自定义
pm2 start app.js --log /var/log/app.log
Error: EACCES: permission denied, open '/var/log/app.log'
✅ 原因
✅ 解决
mkdir -p /var/log/myapp
chown -R node:node /var/log/myapp
✅ 不推荐
sudo node app.js
Linux 默认 stdout 是块缓冲
✅ 现象
✅ 解决
export NODE_ENV=production
或强制无缓冲:
node -e "setInterval(()=>console.log(Date.now()),1000)" | cat
或代码中:
process.stdout.write(msg + '\n');
Linux 默认 UTC
✅ 解决
timedatectl set-timezone Asia/Shanghai
✅ Node 中:
console.log(new Date().toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' }));
✅ 原因
✅ 解决
docker logs container_name
✅ 推荐
console.log / console.error
process.on('uncaughtException', e => {
fs.appendFileSync('error.log', e.stack);
});
✅ 推荐
process.on('SIGTERM', () => {
logger.info('exit');
});
你可以逐条确认:
console.log 而非日志库你可以直接贴出:
1️⃣ 启动方式(pm2 / systemd / docker / bash)
2️⃣ 日志相关代码
3️⃣ 具体“异常现象”(没日志 / 时间错 / 必现崩溃)
我可以直接给你一份可落地的修复方案。