ubuntu

Node.js日志在Ubuntu如何避免磁盘空间不足

小樊
53
2025-09-26 20:13:34
栏目: 云计算

使用日志轮转工具(如logrotate)
logrotate是Ubuntu系统自带的日志管理工具,可自动切割、压缩和删除旧日志文件,防止日志过度占用磁盘空间。配置示例如下:

  1. 安装logrotate(若未安装):sudo apt-get install logrotate
  2. 创建Node.js专用配置文件:sudo nano /etc/logrotate.d/node-app
  3. 添加以下配置(以每日轮转、保留7天、压缩旧日志为例):
    /path/to/your/nodejs/app/*.log {
        daily
        rotate 7
        compress
        delaycompress
        missingok
        notifempty
        create 0640 root adm
        postrotate
            /usr/bin/killall -HUP node  # 重启Node.js进程以释放日志句柄
        endscript
    }
    
    关键参数说明:daily(每日轮转)、rotate 7(保留7天日志)、compress(压缩旧日志)、delaycompress(延迟压缩,避免当天日志被压缩)、missingok(日志文件不存在时不报错)、notifempty(日志为空时不轮转)、create(创建新日志文件并设置权限)。
  4. 测试配置是否正确:sudo logrotate -f /etc/logrotate.d/node-app(强制立即轮转)。

通过Node.js日志库内置功能实现轮转
使用成熟的日志库(如winston),可通过其扩展模块实现日志自动切割,无需依赖系统工具。以winston为例:

  1. 安装依赖:npm install winston winston-daily-rotate-file
  2. 配置日志轮转:
    const winston = require('winston');
    const DailyRotateFile = require('winston-daily-rotate-file');
    
    const logger = winston.createLogger({
        level: 'info',
        format: winston.format.combine(
            winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
            winston.format.printf(({ timestamp, level, message }) => `${timestamp} ${level}: ${message}`)
        ),
        transports: [
            new DailyRotateFile({
                filename: '/path/to/logs/application-%DATE%.log',  // 日志文件名模板(%DATE%会被替换为日期)
                datePattern: 'YYYY-MM-DD',  // 按天切割
                zippedArchive: true,  // 压缩旧日志
                maxSize: '20m',  // 单个日志文件最大20MB(可选,同时支持按大小切割)
                maxFiles: '14d'  // 保留14天日志(可选,与datePattern配合使用)
            })
        ]
    });
    
    logger.info('Hello, world!');
    
    关键参数:filename(日志文件路径,含日期占位符)、datePattern(日期格式,决定切割频率)、zippedArchive(是否压缩旧日志)、maxSize(单文件大小上限)、maxFiles(保留天数)。

优化日志记录策略
减少不必要的日志写入是避免磁盘空间不足的根本措施:

使用进程管理工具(如PM2)
PM2是Node.js常用的进程管理工具,内置日志管理功能,可自动轮转日志并限制日志大小:

  1. 安装PM2:npm install pm2 -g
  2. 启动应用并配置日志轮转:
    • 创建ecosystem.config.js文件:
      module.exports = {
          apps: [{
              name: 'my-app',
              script: 'app.js',
              out_file: '/path/to/logs/out.log',  // 标准输出日志路径
              error_file: '/path/to/logs/err.log',  // 错误输出日志路径
              log_date_format: 'YYYY-MM-DD HH:mm Z',  // 日志时间格式
              log_rotation: {
                  period: '1d',  // 每天轮转一次
                  rotateAfterSize: '10M',  // 单个日志文件达到10MB时轮转
                  keepFiles: 7  // 保留最近7天的日志
              }
          }]
      };
      
    • 启动应用:pm2 start ecosystem.config.js
  3. 保存配置:pm2 save(防止重启后丢失配置)。

监控磁盘空间与自动化清理
定期检查磁盘空间使用情况,及时清理旧日志:

集中式日志管理(可选)
对于分布式系统或多节点应用,可将日志发送到远程集中式日志管理系统(如ELK Stack、Graylog),减轻本地存储压力。这些系统提供强大的日志搜索、分析和告警功能,便于快速定位问题。

0
看了该问题的人还看了