温馨提示×

Linux环境中Node.js日志清理策略

小樊
44
2025-10-19 11:32:51
栏目: 编程语言

Linux环境下Node.js日志清理策略

1. 使用logrotate工具(系统级推荐)

logrotate是Linux系统自带的日志管理工具,支持自动轮转、压缩、删除旧日志,无需修改应用代码,适合大多数场景。

  • 安装logrotate
    Debian/Ubuntu系统运行sudo apt-get install logrotate;CentOS/RHEL系统运行sudo yum install logrotate
  • 配置logrotate
    /etc/logrotate.d/目录下创建Node.js专用配置文件(如nodejs),内容示例如下:
    /path/to/your/nodejs/logs/*.log {
        daily                # 每天轮转一次(可选:weekly/monthly)
        missingok            # 日志文件不存在时不报错
        rotate 7             # 保留最近7个轮转日志
        compress             # 压缩旧日志(节省空间)
        notifempty           # 日志为空时不轮转
        create 0640 root adm # 新日志文件权限及属主(根据实际调整)
    }
    
  • 测试配置
    手动触发轮转以验证配置是否正确:sudo logrotate -f /etc/logrotate.d/nodejs

2. 使用Node.js日志库内置轮转(应用级精准控制)

若应用使用winston、pino等日志库,可通过内置模块实现日志轮转,适合需要定制化日志格式或路径的场景。

  • 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/logs/application-%DATE%.log', // 日志文件名模板(%DATE%会被替换为日期)
        datePattern: 'YYYY-MM-DD',                         // 日期格式(每天一个文件)
        zippedArchive: true,                               // 压缩旧日志
        maxSize: '20m',                                    // 单个日志文件最大20MB
        maxFiles: '14d'                                    // 保留14天内的日志
    });
    
    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]
    });
    
    module.exports = logger;
    
  • pino + pino-rotate
    安装依赖:npm install pino pino-rotate
    配置示例:
    const pino = require('pino');
    const rotate = require('pino-rotate');
    
    const logger = pino({
        level: 'info'
    });
    
    rotate({
        period: '1d',       // 每天轮转一次
        path: '/path/to/logs', // 日志目录
        maxFiles: 7,        // 保留7个日志文件
        gzip: true          // 压缩旧日志
    })(logger);
    
    logger.info('Application started');
    

3. 使用cron定时任务(手动清理)

若不想依赖第三方工具,可通过cron定时执行shell脚本清理旧日志,适合简单场景。

  • 创建清理脚本
    新建/usr/local/bin/clean-nodejs-logs.sh,内容如下:
    #!/bin/bash
    LOG_DIR="/path/to/your/nodejs/logs"
    find "$LOG_DIR" -type f -name "*.log" -mtime +7 -exec rm -f {} \; # 删除7天前的.log文件
    
  • 赋予执行权限
    sudo chmod +x /usr/local/bin/clean-nodejs-logs.sh
  • 设置cron定时任务
    运行crontab -e,添加以下内容(每天凌晨0点执行):
    0 0 * * * /usr/local/bin/clean-nodejs-logs.sh
    

4. 使用systemd定时任务(集成服务管理)

若应用通过systemd管理(如nodejs.service),可创建systemd定时器与服务来清理日志,适合容器化或服务化部署。

  • 创建清理脚本
    同cron方式的clean-nodejs-logs.sh脚本。
  • 创建systemd服务文件
    新建/etc/systemd/system/clean-nodejs-logs.service,内容如下:
    [Unit]
    Description=Clean Node.js logs older than 7 days
    
    [Service]
    ExecStart=/usr/local/bin/clean-nodejs-logs.sh
    
  • 创建systemd定时器文件
    新建/etc/systemd/system/clean-nodejs-logs.timer,内容如下:
    [Unit]
    Description=Run clean-nodejs-logs daily
    
    [Timer]
    OnCalendar=daily
    Persistent=true
    
    [Install]
    WantedBy=timers.target
    
  • 激活并启动定时任务
    sudo systemctl daemon-reload
    sudo systemctl enable clean-nodejs-logs.timer
    sudo systemctl start clean-nodejs-logs.timer
    

5. 使用pm2内置日志管理(进程管理集成)

若使用pm2管理Node.js应用,可通过pm2的内置功能实现日志轮转,无需额外配置工具。

  • 配置日志轮转
    运行pm2 set pm2:log_rotate true开启全局日志轮转,或通过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',
            max_size: '10M',    // 单个日志文件最大10MB
            retain: 7           // 保留7个日志文件
        }]
    };
    
  • 重载pm2配置
    修改配置后运行pm2 reload ecosystem.config.js使设置生效。

0