Node.js日志分割与归档策略

595
2025/3/1 6:32:25
栏目: 编程语言
开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

在Node.js应用程序中,日志分割和归档是确保应用程序稳定运行和便于故障排查的重要环节。以下是一些常见的日志分割与归档策略:

1. 使用日志库

使用成熟的日志库,如 winstonpino,它们提供了丰富的功能来处理日志分割和归档。

Winston

Winston 是一个灵活的日志库,支持多种传输方式和格式,并且可以轻松地集成日志分割和归档。

const winston = require('winston');
const { createLogger, format, transports } = winston;
const { combine, timestamp, printf } = format;

const myFormat = printf(({ level, message, timestamp }) => {
  return `${timestamp} ${level}: ${message}`;
});

const logger = createLogger({
  format: combine(
    timestamp(),
    myFormat
  ),
  transports: [
    new transports.File({ filename: 'error.log', level: 'error' }),
    new transports.File({ filename: 'combined.log' })
  ]
});

// 日志分割和归档
const dailyRotateFileTransport = new transports.DailyRotateFile({
  filename: 'application-%DATE%.log',
  datePattern: 'YYYY-MM-DD-HH',
  zippedArchive: true,
  maxSize: '20m',
  maxFiles: '14d'
});

logger.add(dailyRotateFileTransport);

Pino

Pino 是一个高性能的日志库,支持流式传输和日志分割。

const pino = require('pino');
const { prettyPrint } = require('pino-pretty');

const logger = pino({
  level: 'info',
  transport: {
    target: 'pino-pretty',
    options: {
      colorize: true,
      translateTime: 'SYS:standard'
    }
  }
});

// 日志分割和归档
const { createLogger } = require('pino-rotate');
const loggerWithRotate = createLogger({
  level: 'info',
  transport: {
    target: 'pino-pretty',
    options: {
      colorize: true,
      translateTime: 'SYS:standard'
    }
  },
  interval: '1d',
  path: 'application.log',
  maxsize: '20m',
  gzip: true,
  retainDays: 14
});

2. 使用系统工具

可以使用系统工具如 logrotate 来管理日志文件的分割和归档。

Logrotate 配置示例

创建一个 logrotate 配置文件 /etc/logrotate.d/myapp

/path/to/your/application.log {
  daily
  missingok
  rotate 14
  compress
  delaycompress
  notifempty
  create 640 root adm
}

这个配置会每天分割日志文件,并保留最近14天的日志文件,压缩旧的日志文件。

3. 自定义日志分割逻辑

如果需要更复杂的日志分割逻辑,可以编写自定义的日志分割函数。

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

const logDirectory = '/path/to/logs';
const logFileName = 'application.log';

function rotateLogs() {
  const now = moment();
  const logFile = path.join(logDirectory, logFileName);
  const rotatedLogFile = path.join(logDirectory, `application-${now.format('YYYY-MM-DD')}.log`);

  if (fs.existsSync(logFile)) {
    fs.renameSync(logFile, rotatedLogFile);
  }

  // 创建新的日志文件
  const newLogFile = fs.createWriteStream(logFile, { flags: 'a' });
  newLogFile.write(`Log rotated at ${now.format('YYYY-MM-DD HH:mm:ss')}\n`);
}

// 定期调用 rotateLogs 函数
setInterval(rotateLogs, 86400000); // 每天执行一次

总结

选择合适的日志库和工具,结合自定义逻辑,可以有效地实现Node.js应用程序的日志分割与归档。确保日志文件不会无限增长,同时保留足够的历史数据以便故障排查。

辰迅云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

推荐阅读: linux离线安装openssl怎么实现