温馨提示×

Debian JS日志如何分割

小樊
34
2026-07-13 02:47:08
栏目: 编程语言

在 Debian 上,“JS 日志”通常指 Node.js 应用产生的日志。日志分割(rotate)最常用、最稳妥的方式是 配合 Linux 自带的 logrotate,而不是在 JS 代码里自己处理。下面按常见场景给你一套可落地的做法。


一、推荐方案:logrotate(最常用)

1️⃣ 安装 logrotate(一般已自带)

dpkg -l logrotate

如果没有:

sudo apt update
sudo apt install logrotate

2️⃣ Node.js 应用日志示例

假设你用类似方式写日志:

const fs = require('fs');
fs.writeFileSync('/var/log/myapp/app.log', 'hello\n', { flag: 'a' });

或者 PM2:

pm2 logs

3️⃣ 创建 logrotate 配置

sudo nano /etc/logrotate.d/myapp

示例(✅ 强烈推荐):

/var/log/myapp/*.log {
    daily
    rotate 7
    missingok
    notifempty
    compress
    delaycompress
    copytruncate
    dateext
    dateformat -%Y%m%d
}

参数说明

参数 作用
daily 每天分割
rotate 7 保留 7 份
compress 压缩旧日志
delaycompress 延迟压缩(兼容 Node)
copytruncate ✅ 不重启进程,直接截断文件
dateext 日期命名

生成文件示例:

app.log
app.log-20260121.gz
app.log-20260120.gz

4️⃣ 测试 logrotate

sudo logrotate -d /etc/logrotate.d/myapp

-d 是 debug,不真正执行。

强制执行:

sudo logrotate -f /etc/logrotate.d/myapp

二、PM2 用户(最常见)

如果你用 PM2

PM2 自带日志分割插件

pm2 install pm2-logrotate

配置:

pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true

✅ 优点:

  • 不需要 logrotate
  • 自动按大小切割

⚠️ 缺点:

  • 不如 logrotate 标准
  • 集群模式下偶尔丢日志

三、Docker + Node.js

如果是 Docker:

推荐:Docker log driver

docker run \
  --log-driver=json-file \
  --log-opt max-size=10m \
  --log-opt max-file=5 \
  node-app

syslog / journald

❌ 不建议在容器里再跑 logrotate


四、不推荐:JS 代码里自己切日志

原因:

  • 无法安全 truncate
  • 文件句柄问题
  • 增加复杂度

除非你用的是 Winston + Daily Rotate File

npm install winston-daily-rotate-file
const transport = new DailyRotateFile({
  dirname: '/var/log/myapp',
  filename: 'app-%DATE%.log',
  datePattern: 'YYYY-MM-DD',
  maxFiles: '7d'
});

✅ 适合小项目
❌ 不适合生产高并发


五、systemd 服务日志(journal)

如果是 systemd 启动的 Node 服务:

journalctl -u myapp -f

日志由 systemd 管理,不需要额外分割。


六、最佳实践总结 ✅

场景 推荐
普通 Node 服务 ✅ logrotate
PM2 ✅ pm2-logrotate
Docker ✅ docker log driver
小工具 winston-daily-rotate

如果你愿意,可以把你的 Node 启动方式(PM2 / systemd / Docker)和日志路径发出来,我可以直接帮你写一份 可用的 logrotate 配置

0