插件窝 干货文章 Linux Node.js日志轮转策略怎样配置

Linux Node.js日志轮转策略怎样配置

日志 轮转 文件 logrotate 534    来源:    2025-05-06

Linux Node.js 日志轮转策略配置指南

在Linux系统中配置Node.js应用的日志轮转(Log Rotation)可以有效管理日志文件,防止日志文件过大占用过多磁盘空间。以下是几种常见的配置方法:

1. 使用logrotate工具(推荐)

logrotate是Linux系统自带的日志轮转工具,适用于大多数Node.js应用。

配置步骤

  1. 创建logrotate配置文件(通常放在/etc/logrotate.d/目录下)
sudo nano /etc/logrotate.d/nodejs-app
  1. 添加以下内容(根据实际需求调整):
/path/to/your/nodejs/app/logs/*.log {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    copytruncate
    dateext
    dateformat -%Y%m%d
    sharedscripts
    postrotate
        [ ! -f /var/run/nodejs-app.pid ] || kill -USR1 `cat /var/run/nodejs-app.pid`
    endscript
}

参数说明

  • daily: 每天轮转一次
  • missingok: 如果日志文件不存在也不报错
  • rotate 30: 保留30个旧日志文件
  • compress: 压缩旧日志
  • delaycompress: 延迟压缩(压缩前一个轮转周期)
  • notifempty: 空日志文件不轮转
  • copytruncate: 复制日志文件后清空原文件(适用于不能重开日志的程序)
  • dateext: 使用日期作为轮转文件后缀
  • dateformat: 日期格式
  • sharedscripts: 所有日志轮转完成后再执行脚本
  • postrotate: 轮转后执行的命令

2. 使用PM2的日志管理

如果你使用PM2管理Node.js进程,PM2内置了日志轮转功能:

# 安装pm2-logrotate模块
pm2 install pm2-logrotate

# 配置pm2-logrotate
pm2 set pm2-logrotate:max_size 100M  # 单个日志文件最大100MB
pm2 set pm2-logrotate:retain 30      # 保留30个日志文件
pm2 set pm2-logrotate:compress true  # 压缩旧日志
pm2 set pm2-logrotate:dateFormat YYYY-MM-DD_HH-mm-ss

3. 使用Node.js日志模块的内置轮转

一些Node.js日志库(如winston、log4js等)支持内置的日志轮转:

winston示例

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

const logger = winston.createLogger({
  format: combine(
    timestamp(),
    printf(info => `${info.timestamp} ${info.level}: ${info.message}`)
  ),
  transports: [
    new winston.transports.DailyRotateFile({
      filename: 'application-%DATE%.log',
      dirname: '/path/to/logs',
      datePattern: 'YYYY-MM-DD',
      zippedArchive: true,
      maxSize: '100m',
      maxFiles: '30d'
    })
  ]
});

log4js示例

const log4js = require('log4js');

log4js.configure({
  appenders: {
    file: {
      type: 'dateFile',
      filename: '/path/to/logs/app.log',
      pattern: '.yyyy-MM-dd',
      keepFileExt: true,
      numBackups: 30,
      compress: true
    }
  },
  categories: {
    default: { appenders: ['file'], level: 'info' }
  }
});

const logger = log4js.getLogger();

4. 手动轮转脚本

你也可以编写简单的shell脚本实现日志轮转:

#!/bin/bash
LOG_DIR="/path/to/logs"
DATE=$(date +%Y%m%d)

# 重命名当前日志
mv $LOG_DIR/app.log $LOG_DIR/app-$DATE.log

# 重新创建日志文件
touch $LOG_DIR/app.log

# 发送信号给Node.js应用重新打开日志文件
kill -USR1 $(cat /var/run/nodejs-app.pid)

# 压缩旧日志
find $LOG_DIR -name "app-*.log" -mtime +30 -exec gzip {} \;

# 删除过旧日志
find $LOG_DIR -name "app-*.gz" -mtime +90 -delete

最佳实践建议

  1. 选择合适的轮转策略:根据日志量选择按日、按大小或混合策略
  2. 保留适当的日志历史:通常30天足够,关键系统可保留更久
  3. 启用压缩:节省磁盘空间
  4. 监控日志目录:确保有足够的磁盘空间
  5. 考虑日志集中管理:对于多服务器环境,考虑使用ELK、Fluentd等集中式日志管理方案

通过以上方法,你可以有效地管理Node.js应用的日志文件,既保留了必要的日志信息,又避免了日志文件无限增长带来的问题。