温馨提示×

为何debian js日志丢失

小樊
43
2026-09-07 06:44:28
栏目: 编程语言

Debian 上“JS 日志丢失”通常不是 JS 语言本身的问题,而是运行环境、日志系统或配置导致的。下面按常见原因分类说明,并给出排查思路。


一、最常见的几类原因

1. systemd / journald 吞掉了日志

如果你的 JS 程序(Node.js)是通过 systemd service 运行的:

  • 日志默认写入 journald
  • 如果没配置持久化,重启后日志就没了
  • console.log 在 systemd 下可能只进 journal,不写文件

检查:

journalctl -u your-service.service --no-pager

是否持久化:

ls /var/log/journal

如果没有,说明是易失日志。


2. 日志重定向到了 /dev/null

常见于:

  • 启动脚本里写了 > /dev/null 2>&1
  • PM2 / nodemon / docker 配置错误

例如:

node app.js > /dev/null 2>&1 &

3. 程序以 daemon / fork 方式运行

Node.js 在:

  • pm2
  • nohup
  • forever
  • 自定义 daemon

情况下:

  • 标准输出可能在父进程退出时被关闭
  • 日志还没 flush 就丢了

4. 日志文件被 logrotate 误删或截断

Debian 默认有 logrotate

  • 配置错误会导致:
    • 文件被清空
    • 文件被删除但程序还持有旧 fd
  • 结果:你看到“日志没了”,但其实在内存 fd 里

检查:

lsof | grep deleted

5. Node.js 崩溃导致未 flush

Node 是异步写日志

  • console.log 不一定立即落盘
  • 进程被 SIGKILL、OOM、Docker stop 会丢日志

6. Docker / 容器环境

如果你在 Debian 上跑容器:

  • 日志在容器内
  • 容器销毁 → 日志消失
  • 没挂载 volume

7. 权限问题

  • 日志目录不可写
  • 以非 root 运行但写 /var/log
  • 静默失败(不报错)

二、快速自查清单

# 1. 是否是 systemd
ps -p 1 -o comm=

# 2. 服务日志
journalctl -u <service>

# 3. 是否有 deleted 日志
lsof | grep deleted

# 4. 启动命令
systemctl cat <service>

# 5. 日志目录权限
ls -ld /var/log/your-app

三、推荐的正确做法(避免丢失)

✅ 用日志库而不是 console.log

  • winston
  • pino

✅ 明确写文件:

logger.add(new transports.File({ filename: '/var/log/app/app.log' }))

✅ systemd 服务示例:

[Service]
ExecStart=/usr/bin/node /opt/app/app.js
StandardOutput=append:/var/log/app/app.log
StandardError=append:/var/log/app/error.log

✅ 配置 logrotate:

/var/log/app/*.log {
  daily
  rotate 7
  compress
  copytruncate
}

四、如果你愿意

你可以告诉我:

  1. JS 是 Node.js 还是浏览器
  2. 怎么运行的(systemd / pm2 / docker / 脚本)
  3. 日志本来应该写在哪里

我可以直接帮你定位是哪一种“丢失”。

0