温馨提示×

linux js日志怎么分割

小樊
47
2026-09-26 17:59:39
栏目: 编程语言

在 Linux 下对 JS(Node.js)日志进行分割,常见做法有以下几种,按“是否改代码”和“是否用系统工具”来分:


一、不改代码:用 Linux 系统工具分割(推荐)

1️⃣ logrotate(最常用)

适合:已输出到文件的日志(如 app.log)

示例配置 /etc/logrotate.d/nodejs:

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

说明:

  • daily:每天分割
  • rotate 14:保留 14 天
  • compress:压缩旧日志
  • copytruncate:不重启 Node 进程(很重要)

✅ 优点:简单、稳定
❌ 缺点:不是“实时按大小”


2️⃣ 用 cron + shell 脚本(按大小)

适合:日志特别大

#!/bin/bash
LOG=/var/log/nodejs/app.log
MAX=104857600  # 100MB

if [ -f "$LOG" ]; then
  size=$(stat -c%s "$LOG")
  if [ "$size" -gt "$MAX" ]; then
    mv "$LOG" "$LOG.$(date +%Y%m%d%H%M%S)"
    touch "$LOG"
  fi
fi

加 cron:

* * * * * /opt/scripts/split_log.sh

二、改代码:Node.js 日志库自带分割(推荐生产)

3️⃣ winston + winston-daily-rotate-file(最流行)

npm i winston winston-daily-rotate-file
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');

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

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

✅ 支持:

  • 按天
  • 按大小
  • 自动删除旧日志

4️⃣ pino + pino-roll

适合:高性能日志

npm i pino pino-roll
const pino = require('pino');
const logger = pino({
  transport: {
    target: 'pino-roll',
    options: {
      file: '/var/log/nodejs/app.log',
      frequency: 'daily',
      size: '10m'
    }
  }
});

三、容器 / PM2 场景

5️⃣ PM2 日志分割

pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7

四、怎么选?

场景 推荐方式
已跑起来不改代码 logrotate
微服务 / 容器 pino / winston
PM2 管理 pm2-logrotate
超大日志 按大小 + cron

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

  • 用的是 Node 还是前端构建日志
  • 日志是 文件 / stdout / docker
  • 是否允许改代码

我可以直接给你一套现成方案。

0 踩