温馨提示×

Ubuntu Node.js日志轮转技巧

小樊
44
2025-10-30 17:21:41
栏目: 编程语言

使用 logrotate 工具(系统级日志轮转)
logrotate 是 Ubuntu 系统自带的日志管理工具,可自动处理 Node.js 应用日志的轮转、压缩和清理,无需修改应用代码。

  • 安装 logrotate:若未安装,通过以下命令安装:
    sudo apt-get update && sudo apt-get install logrotate
    
  • 创建配置文件:在 /etc/logrotate.d/ 目录下新建针对 Node.js 应用的配置文件(如 nodejs-app):
    sudo nano /etc/logrotate.d/nodejs-app
    
  • 配置参数说明:在配置文件中添加以下内容(根据实际路径调整):
    /path/to/your/nodejs/app/*.log {
      daily                # 每天轮转一次(可选:weekly/monthly)
      rotate 7             # 保留最近7个轮转文件
      compress             # 压缩旧日志(节省空间)
      delaycompress        # 延迟压缩(如第8个文件才压缩第1个)
      missingok            # 日志文件不存在时不报错
      notifempty           # 日志为空时不轮转
      create 0640 root adm # 新日志文件权限(属主root,属组adm)
      sharedscripts        # 多个日志文件匹配时,postrotate仅执行一次
      postrotate
        # 若应用由systemd管理,建议用systemctl重启(避免kill进程)
        systemctl restart your-nodejs-app.service
        # 若直接通过进程ID启动,可注释上方行,取消下方注释
        # kill -HUP `cat /path/to/your/nodejs/app/pidfile`
      endscript
    }
    
  • 测试配置:手动触发轮转以验证配置是否正确:
    sudo logrotate -f /etc/logrotate.d/nodejs-app
    
  • 自动运行:logrotate 默认通过系统 cron 任务(/etc/cron.daily/logrotate)每天自动执行,无需额外配置。

使用 Winston + winston-daily-rotate-file(应用层日志轮转)
若需更灵活的控制(如按文件大小轮转、自定义日志格式),可使用 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({
      filename: '/path/to/your/logs/application-%DATE%.log', // 日志文件名(含日期占位符)
      datePattern: 'YYYY-MM-DD',                             // 日期格式(每天一个文件)
      zippedArchive: true,                                   // 压缩旧日志
      maxSize: '20m',                                        // 单个文件最大大小(超过则轮转)
      maxFiles: '14d',                                       // 保留最近14天的日志
      createSymlink: true,                                   // 创建符号链接(指向最新日志)
      symlinkName: 'current.log'                             // 符号链接名称
    });
    
    const logger = winston.createLogger({
      level: 'info',
      format: winston.format.combine(
        winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), // 添加时间戳
        winston.format.json()                                  // JSON格式输出
      ),
      transports: [transport]                                  // 使用轮转传输
    });
    
    // 测试日志
    logger.info('This is a rotated log message.');
    
  • 优势:可根据业务需求调整轮转条件(如按大小、时间),支持多传输目标(如同时输出到控制台和文件),适合需要精细化管理的应用。

使用 Pino + pino-rotate(高性能日志轮转)
若应用对日志性能要求极高(如实时性强的微服务),可使用 Pino 日志库(Node.js 性能最高的日志库)结合 pino-rotate 插件,实现高效的日志轮转。

  • 安装依赖
    npm install pino pino-rotate
    
  • 配置示例
    const pino = require('pino');
    const rotate = require('pino-rotate');
    
    const logger = pino({
      level: 'info',
      transport: {
        target: 'pino-pretty', // 可选:美化输出(开发环境使用)
        options: { colorize: true }
      }
    });
    
    // 启动轮转(每天轮转,保留14天,压缩旧日志)
    rotate({
      period: '1d',          // 轮转周期(1d=每天)
      path: '/path/to/your/logs/pino-', // 日志路径前缀
      maxsize: '20m',        // 单个文件最大大小
      compress: true         // 压缩旧日志
    })(logger);
    
    // 测试日志
    logger.info('This is a high-performance rotated log message.');
    
  • 优势:Pino 采用二进制 JSON 格式,日志写入速度远快于其他库(约 10 倍于 Winston),适合高并发场景;pino-rotate 支持按时间和大小轮转,兼顾性能与管理需求。

0