温馨提示×

Nodejs日志为何在Linux异常

小樊
41
2026-08-29 01:18:23
栏目: 编程语言

在 Linux 上 Node.js 日志“异常”通常不是 Node 本身的 bug,而是环境、配置或行为差异导致的。下面按最常见原因 → 对应现象 → 解决方案来系统说明。


一、输出位置异常(最常见)

1️⃣ 日志没写文件,而是输出到 stdout / stderr

在 Linux 中:

  • console.logstdout
  • console.errorstderr

如果你用 pm2 / systemd / docker 启动,日志并不会自动写文件

✅ 现象

  • 本地能看见日志
  • 服务器上“没有日志”

✅ 解决

const fs = require('fs');
fs.appendFileSync('app.log', msg);

或使用日志库:

const winston = require('winston');

二、systemd / pm2 吞掉日志

2️⃣ systemd 情况

StandardOutput=journal
StandardError=journal

✅ 日志在:

journalctl -u your-service -f

✅ 解决

StandardOutput=append:/var/log/app.log
StandardError=append:/var/log/app-error.log

3️⃣ pm2 情况

pm2 默认接管日志

pm2 logs
pm2 logs app

✅ 日志位置

~/.pm2/logs/

✅ 自定义

pm2 start app.js --log /var/log/app.log

三、权限问题(Linux 特有)

4️⃣ EACCES / 无日志

Error: EACCES: permission denied, open '/var/log/app.log'

✅ 原因

  • Node 进程用户无写权限
  • 日志目录不存在

✅ 解决

mkdir -p /var/log/myapp
chown -R node:node /var/log/myapp

✅ 不推荐

sudo node app.js

四、换行 / 缓冲问题(非常隐蔽)

5️⃣ 日志“延迟”或“不显示”

Linux 默认 stdout 是块缓冲

✅ 现象

  • 本地立刻打印
  • 服务器要等很久才出现

✅ 解决

export NODE_ENV=production

或强制无缓冲:

node -e "setInterval(()=>console.log(Date.now()),1000)" | cat

或代码中:

process.stdout.write(msg + '\n');

五、时区问题(看起来“异常”)

6️⃣ 日志时间不对

Linux 默认 UTC

✅ 解决

timedatectl set-timezone Asia/Shanghai

✅ Node 中:

console.log(new Date().toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' }));

六、Docker 场景

7️⃣ Docker 中日志不见了

✅ 原因

  • 写文件不在 volume
  • stdout 被 docker 接管

✅ 解决

docker logs container_name

✅ 推荐

console.log / console.error

七、崩溃但未记录日志

8️⃣ 进程直接退出

process.on('uncaughtException', e => {
  fs.appendFileSync('error.log', e.stack);
});

✅ 推荐

process.on('SIGTERM', () => {
  logger.info('exit');
});

八、快速自查清单 ✅

你可以逐条确认:

  • [ ] 是否使用 console.log 而非日志库
  • [ ] 是否被 pm2 / systemd / docker 接管
  • [ ] 日志目录是否存在 & 有权限
  • [ ] 是否 stdout 缓冲导致延迟
  • [ ] 时区是否正确
  • [ ] 是否崩溃但无异常处理

九、如果你愿意,我可以进一步帮你

你可以直接贴出:

1️⃣ 启动方式(pm2 / systemd / docker / bash)
2️⃣ 日志相关代码
3️⃣ 具体“异常现象”(没日志 / 时间错 / 必现崩溃)

我可以直接给你一份可落地的修复方案

0