温馨提示×

Ubuntu Nodejs日志怎么分割

小樊
49
2026-07-21 19:27:46
栏目: 编程语言

在 Ubuntu 上,Node.js 日志分割常见有几种方式,从简单到专业给你一个完整方案。你可以按场景选择。


一、最简单:用 logrotate(推荐 ✅)

适合场景:Node.js 直接用 fs.writeFile / fs.createWriteStream 写日志,或 PM2 日志。

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

which logrotate

2️⃣ 创建日志分割配置

假设你的日志路径是:

/var/log/myapp/app.log

新建配置:

sudo vim /etc/logrotate.d/myapp

内容示例:

/var/log/myapp/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0640 www-data www-data
    copytruncate
}

参数说明

参数 作用
daily 每天分割
rotate 7 保留 7 份
compress 压缩旧日志
copytruncate 不重启 Node.js 也能生效
missingok 日志不存在不报错

3️⃣ 测试

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

优点:简单、稳定、不依赖 Node 代码
缺点copytruncate 有极小概率丢几行日志


二、PM2 自带日志分割(最常用 ✅✅)

适合场景:用 PM2 管理 Node.js

1️⃣ 安装 PM2

npm install -g pm2

2️⃣ 安装日志插件

pm2 install pm2-logrotate

3️⃣ 配置

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

✅ 日志路径一般在:

~/.pm2/logs/

优点

  • 自动按大小分割
  • 不需要改代码
  • 生产环境非常常见

缺点

  • 强制依赖 PM2

三、Node.js 代码级日志分割(Winston + Daily Rotate)

适合场景:需要按天、按大小、自动清理

1️⃣ 安装依赖

npm install winston winston-daily-rotate-file

2️⃣ 示例

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

const transport = new DailyRotateFile({
  dirname: '/var/log/myapp',
  filename: 'app-%DATE%.log',
  datePattern: 'YYYY-MM-DD',
  maxSize: '20m',
  maxFiles: '14d',
  zippedArchive: true
});

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  transports: [
    transport,
    new winston.transports.Console()
  ]
});

logger.info('hello world');

优点

  • 非常灵活
  • 不依赖系统工具

缺点

  • 代码侵入性强
  • 多进程要小心

四、Docker 场景(补充)

如果你在 Docker 中运行 Node.js:

docker logs

✅ 推荐:

  • 输出到 stdout
  • 使用 Docker log driver
  • 或挂载 volume + logrotate

五、推荐选择总结 ✅

场景 推荐方案
生产环境 + PM2 PM2 logrotate
普通 Node 服务 logrotate
需要精细控制 Winston Daily Rotate
Docker stdout + log driver

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

  • ✅ 是否使用 PM2
  • ✅ 日志路径
  • ✅ 日志大小 / 保留天数

我可以帮你直接写一份可用的配置文件

0