温馨提示×

Linux JS日志如何分割

小樊
44
2026-08-28 23:44:22
栏目: 编程语言

在 Linux 下对 JavaScript(Node.js)应用的日志进行分割,常见做法有 3 类,从简单到专业依次是:


一、应用层拆分(Node.js 自带逻辑)

适合你自己控制日志格式和文件名。

示例:按日期生成日志文件

const fs = require('fs');
const path = require('path');

const logDir = path.join(__dirname, 'logs');
if (!fs.existsSync(logDir)) fs.mkdirSync(logDir);

const getLogStream = () => {
  const date = new Date().toISOString().slice(0, 10); // 2026-01-21
  const logFile = path.join(logDir, `${date}.log`);
  return fs.createWriteStream(logFile, { flags: 'a' });
};

setInterval(() => {
  stream.end();
  stream = getLogStream();
}, 24 * 60 * 60 * 1000); // 每天切换

✅ 优点:简单
❌ 缺点:无自动压缩、无历史清理


二、使用日志库(推荐 ✅)

1️⃣ 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: 'logs',
  filename: 'app-%DATE%.log',
  datePattern: 'YYYY-MM-DD',
  maxSize: '20m',        // 单文件最大
  maxFiles: '14d',       // 保留 14 天
  zippedArchive: true    // 自动压缩
});

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

logger.info('Hello JS log');

✅ 自动按天 / 大小分割
✅ 自动压缩
✅ 自动清理
✅ 生产环境首选


三、系统级日志分割(Linux 通用方案)

即使你用 console.logpm2 logs,也可以用 logrotate

示例:Node.js 日志

sudo vim /etc/logrotate.d/node-app
/var/log/node/app.log {
    daily
    rotate 7
    size 50M
    compress
    missingok
    notifempty
    copytruncate
}

常用参数说明

参数 说明
daily 按天
rotate 保留份数
size 超过大小也切
compress gzip
copytruncate 不中断进程

✅ 适合 PM2 / Docker / 裸跑 Node
✅ 不依赖 JS 代码


四、PM2 用户(很常见)

PM2 自带日志,但不会自动分割

推荐方案

pm2 install pm2-logrotate

配置

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

✅ 最简单
✅ 适合 PM2 部署


五、方案选择建议(总结)

场景 推荐方案
小项目 / 学习 应用层按日期
生产环境 Winston + daily-rotate-file
PM2 部署 pm2-logrotate
随便跑的脚本 logrotate

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

  • ✅ 是否使用 PM2
  • ✅ 是否 Docker
  • ✅ 日志路径
  • ✅ 日志量(MB / GB)

我可以帮你直接写 完整可上线配置

0