温馨提示×

为啥debian js日志丢失

小樊
39
2026-10-15 21:59:17
栏目: 编程语言

Debian 上“JS 日志丢失”通常不是 JS 语言本身的问题,而是运行环境、日志配置、系统日志机制或权限导致的。下面按常见原因给你梳理一下,你可以对照排查。


一、最常见原因

1. 用了 console.log,但没看到输出

JS 里 console.log 默认输出到 stdout / stderr:

  • Node.js 直接运行

    node app.js
    

    日志在终端

  • 后台运行(nohup / &)

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

    如果没重定向,日志就“丢”了

✅ 解决:

node app.js >> /var/log/myapp.log 2>&1

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

如果你用 systemd 启动 Node 服务:

[Service]
ExecStart=/usr/bin/node /opt/app/app.js

日志不在文件里,而在 journald

查看:

journalctl -u yourapp.service

✅ 日志“丢失”其实是进了 journal

查看实时:

journalctl -u yourapp -f

3. 日志被 logrotate 清掉

Debian 默认有 logrotate:

  • 日志被压缩
  • 或被删除
  • 或大小超限

检查:

cat /etc/logrotate.d/*

现象:

  • 昨天还有
  • 今天没了
  • 只剩 .gz

4. 权限问题(写不进去)

JS 进程用户(如 www-data、node)没有写日志权限

比如:

fs.appendFileSync('/var/log/app.log', 'log')

但目录权限是:

drwxr-x--- root root /var/log

✅ 解决:

sudo chown -R node:node /var/log/myapp

5. 程序崩了,没 catch 错误

Node 未捕获异常直接退出:

process.on('uncaughtException', e => {
  console.error(e)
})

否则:

  • 日志没写
  • 进程直接死

6. Docker / 容器环境

如果你在 Docker 里跑:

  • 日志在容器里
  • 容器删了 → 日志没了

✅ 正确方式:

  • 挂载 volume
  • 或用 docker logs

二、推荐做法(防丢失)

✅ 用专业日志库

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

✅ systemd + journald(官方推荐)

StandardOutput=journal
StandardError=journal

三、你可以补充这些信息,我能精准定位

  1. JS 是 Node / 浏览器 / Electron?
  2. 怎么运行的(systemd / pm2 / docker / 直接 node)?
  3. 日志本来写哪?
  4. 是完全没,还是过段时间没了?

我可以给你一套完整配置。

0 踩