温馨提示×

debian nodejs日志怎样分割

小樊
43
2026-09-13 05:27:15
栏目: 编程语言

在 Debian 上,Node.js 应用本身的日志通常不会自动分割,需要借助外部工具或代码逻辑来实现。常见做法有以下几种,按推荐程度从易到难说明:


一、使用 logrotate(最推荐,系统级)

适合:所有 Node.js 服务(PM2、systemd、裸跑都行)

1. 示例(假设日志在 /var/log/nodeapp/

创建配置文件:

sudo nano /etc/logrotate.d/nodeapp

内容示例:

/var/log/nodeapp/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    copytruncate
}

说明:

  • daily:每天切割
  • rotate 14:保留 14 天
  • compress:压缩旧日志
  • copytruncate:不重启 Node.js 也能切割(非常重要)

2. 手动测试

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

优点:简单、稳定、不影响进程
缺点:粒度只能到天


二、使用 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
pm2 set pm2-logrotate:dateFormat YYYY-MM-DD_HH-mm-ss

✅ 自动按大小分割
❌ 仅限 PM2 管理的进程


三、Node.js 代码内部分割(不推荐)

如使用 winston + winston-daily-rotate-file

const { createLogger, transports } = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');

const logger = createLogger({
  transports: [
    new DailyRotateFile({
      filename: '/var/log/nodeapp/app-%DATE%.log',
      datePattern: 'YYYY-MM-DD',
      maxFiles: '14d'
    })
  ]
});

✅ 灵活
❌ 增加代码复杂度


四、使用 systemd + journald(Debian 10+)

如果你用 systemd 启动 Node.js:

[Service]
StandardOutput=journal
StandardError=journal

日志查看:

journalctl -u nodeapp

可配置:

sudo nano /etc/systemd/journald.conf
SystemMaxUse=500M
MaxRetentionSec=2week

✅ 系统级
❌ 不生成普通 .log 文件


推荐方案总结

场景 推荐方式
生产服务 logrotate
用 PM2 pm2-logrotate
微服务/容器 直接输出 stdout + 外部采集
需要按小时 logrotate + cron 或代码

如果你愿意,可以告诉我:

  • Node.js 是怎么启动的(PM2 / systemd / docker)
  • 日志路径
  • 想按「大小」还是「时间」分割

我可以给你一份可直接用的配置

0