linux

Node.js日志轮转与压缩实践

小樊
67
2025-05-24 19:39:38
栏目: 编程语言

在Node.js应用中,日志轮转和压缩是重要的维护任务,有助于管理日志文件的大小和数量,从而优化磁盘空间使用和提高系统性能。以下是一些实践方法:

日志轮转

  1. 使用winston winston是一个流行的Node.js日志库,支持日志轮转。你可以使用winston-daily-rotate-file传输来实现每日轮转。

    const winston = require('winston');
    const DailyRotateFile = require('winston-daily-rotate-file');
    
    const transport = new DailyRotateFile({
      filename: 'application-%DATE%.log',
      datePattern: 'YYYY-MM-DD-HH',
      zippedArchive: true,
      maxSize: '20m',
      maxFiles: '14d'
    });
    
    const logger = winston.createLogger({
      level: 'info',
      format: winston.format.json(),
      transports: [
        transport
      ]
    });
    
    logger.info('Hello, world!');
    
  2. 使用pino pino是另一个高性能的日志库,支持日志轮转。你可以使用pino-rotate库来实现日志轮转。

    const pino = require('pino');
    const rotate = require('pino-rotate');
    
    const logger = pino({
      level: 'info'
    });
    
    rotate({
      period: '1d',
      path: 'application.log',
      size: '20m',
      compress: true,
      rotate: true
    });
    
    logger.info('Hello, world!');
    

日志压缩

  1. 使用zlib Node.js内置的zlib库可以用来压缩日志文件。你可以在日志轮转时自动压缩旧日志文件。

    const fs = require('fs');
    const zlib = require('zlib');
    const path = require('path');
    
    function compressFile(filePath) {
      const gzip = zlib.createGzip();
      const inputStream = fs.createReadStream(filePath);
      const outputStream = fs.createWriteStream(filePath + '.gz');
    
      inputStream.pipe(gzip).pipe(outputStream);
    }
    
    // 假设你已经有一个日志文件路径
    const logFilePath = 'application.log';
    compressFile(logFilePath);
    
  2. 使用archiver archiver是一个用于创建归档文件的Node.js库,支持多种压缩格式。

    const fs = require('fs');
    const archiver = require('archiver');
    
    function compressFolder(folderPath, outputFilePath) {
      const output = fs.createWriteStream(outputFilePath);
      const archive = archiver('zip', {
        zlib: { level: 9 } // 设置压缩级别
      });
    
      output.on('close', () => {
        console.log(`${archive.pointer()} total bytes`);
        console.log('archiver has been finalized and the output file descriptor has closed.');
      });
    
      archive.on('error', (err) => {
        throw err;
      });
    
      archive.directory(folderPath, false);
      archive.pipe(output);
    
      archive.finalize();
    }
    
    // 假设你已经有一个日志文件夹路径
    const logFolderPath = 'logs';
    const outputZipPath = 'logs.zip';
    compressFolder(logFolderPath, outputZipPath);
    

自动化任务

你可以使用cron作业或其他任务调度工具来自动化日志轮转和压缩任务。例如,在Linux系统上,你可以使用cron来每天运行一个脚本来处理日志文件。

# 编辑cron作业
crontab -e

# 添加以下行来每天午夜运行日志轮转和压缩脚本
0 0 * * * /usr/bin/node /path/to/your/log-rotate-script.js

log-rotate-script.js中,你可以编写日志轮转和压缩的逻辑。

通过这些方法,你可以有效地管理Node.js应用的日志文件,确保它们不会占用过多的磁盘空间,并且可以轻松地进行归档和压缩。

0
看了该问题的人还看了