温馨提示×

nodejs linux日志丢失怎么查

小樊
52
2026-09-08 13:55:29
栏目: 编程语言

在 Linux 上排查 Node.js 日志丢失问题,通常可以从「进程、日志配置、系统机制、磁盘」几个方向入手。下面是一套比较实用的排查思路。


一、确认日志到底“丢在哪一层”

先明确:
是应用没写?还是写了但文件没有?还是被系统清掉了?

1. 应用层是否真的输出了日志

node app.js 2>&1 | tee /tmp/test.log
  • 如果 /tmp/test.log 有,说明应用写了
  • 如果 tee 里都没有,说明日志根本没产生

二、检查 Node.js 日志配置

1. 使用了什么日志方式

常见:

  • console.log
  • winston
  • pino
  • log4js

重点检查:

  • 日志路径是否存在
  • 是否有 fs.appendFile / createWriteStream
  • 是否异步写失败被吞掉

示例检查:

process.on('uncaughtException', e => console.error(e));
process.on('unhandledRejection', e => console.error(e));

三、Linux 下常见“日志消失”原因

1. 标准输出被重定向丢失

很多 Node 服务这样启动:

node app.js > log.txt 2>&1 &

但如果:

  • 终端关闭
  • nohup 没加
  • 父进程退出

日志可能断掉。

✅ 正确方式:

nohup node app.js > log.txt 2>&1 &

或用 pm2:

pm2 start app.js
pm2 logs

2. systemd 吞掉日志(非常常见)

如果你用:

systemctl start yourapp

那日志不在文件,而在:

journalctl -u yourapp.service -f

检查 service 文件:

[Service]
StandardOutput=journal
StandardError=journal

✅ 想写文件:

StandardOutput=append:/var/log/yourapp.log

3. 日志被 logrotate 切走或清掉

检查:

ls -l /var/log/yourapp*
cat /etc/logrotate.d/yourapp

常见问题:

  • 切完后 Node 仍写旧 fd
  • 文件被删但进程没释放

查看是否被删:

lsof | grep deleted

4. 磁盘满了 / inode 用光

df -h
df -i

如果 inode 满,日志也写不进去。


四、Node 进程异常退出导致日志中断

1. 是否崩溃

dmesg | grep node
journalctl -xe

2. 是否被 OOM 杀掉

grep -i oom /var/log/messages

五、推荐稳妥的日志方案

✅ 用 PM2(最省心)

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

✅ 用 Winston + 文件

const winston = require('winston');
winston.add(new winston.transports.File({ filename: '/var/log/app.log' }));

✅ 容器 / K8s

  • 不要写文件
  • 直接输出 stdout
  • 由 docker / k8s 收集

六、快速排查清单(直接用)

# 1. 进程是否还在
ps aux | grep node

# 2. 日志文件
ls -l /var/log/yourapp.log

# 3. systemd 日志
journalctl -u yourapp -f

# 4. 被删文件
lsof | grep node | grep deleted

# 5. 磁盘
df -h && df -i

如果你愿意,可以把:

  • 启动方式(pm2 / systemd / docker)
  • 日志代码示例
  • 日志路径

贴出来,我可以帮你精准定位是哪一类问题。

0 踩