温馨提示×

nodejs日志ubuntu如何分割

小樊
42
2026-10-18 05:36:20
栏目: 编程语言

在 Ubuntu 上,Node.js 应用本身的日志通常不会自动分割,需要借助外部工具或代码层方案来实现。下面按常见程度给你几种实用方案。


一、推荐方案(生产环境):logrotate + Node 日志写入文件

1️⃣ Node.js 只负责写日志

例如使用 winston / pino / 原生 fs 写文件:

// 示例:只写文件,不自己切分
const fs = require('fs');
fs.appendFileSync('/var/log/myapp/app.log', logText);

2️⃣ 使用 Ubuntu 自带 logrotate

创建配置文件

sudo vim /etc/logrotate.d/myapp

示例配置

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

参数说明

  • daily:每天切分
  • rotate 14:保留 14 天
  • compress:压缩旧日志
  • copytruncate:不重启 Node 也能切分(关键)

手动测试

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

✅ 最稳定、最常用


二、Node.js 内部自动分割(适合小项目)

使用 winston + winston-daily-rotate-file

npm install winston winston-daily-rotate-file
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',
  maxFiles: '14d',
  zippedArchive: true
});

const logger = winston.createLogger({
  transports: [transport]
});

✅ 优点:

  • 不依赖系统
  • 按天自动切分

❌ 缺点:

  • 多进程时不友好

三、PM2 用户(非常常见)

PM2 自带日志分割

pm2 install pm2-logrotate

配置示例:

pm2 set pm2-logrotate:rotateInterval '0 0 * * *'
pm2 set pm2-logrotate:retain 14
pm2 set pm2-logrotate:compress true

✅ 适合:

  • 用 PM2 管理 Node 服务
  • 不想写额外配置

四、systemd 服务(如果你用 systemd)

配合 StandardOutput=append:/var/log/myapp/app.log
再使用 logrotate(copytruncate)


五、方案对比

方案 是否推荐 适合场景
logrotate ⭐⭐⭐⭐⭐ 生产环境
winston 分割 ⭐⭐⭐ 小项目
PM2 logrotate ⭐⭐⭐⭐ PM2 用户
自己写脚本 ❌ 不推荐

六、常见坑

❌ Node 写日志用 > 重定向
❌ logrotate 没用 copytruncate 导致 Node 继续写旧文件
❌ 多进程同时写日志文件


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

  • 是否用 PM2
  • 是否 Docker
  • 日志量大小

我可以给你精准配置。

0 踩