温馨提示×

Debian Node.js 日志如何配置

小樊
67
2025-09-18 18:00:02
栏目: 编程语言

Debian系统下Node.js日志配置指南

在Debian系统中,Node.js日志配置需根据生产/开发环境需求选择合适方案,核心目标是将日志结构化、持久化,并实现高效管理。以下是常见配置方法及步骤:

一、基础日志记录:内置console模块

最简单的日志方式是使用Node.js内置的console.log/console.error,适用于开发调试。若需将日志写入文件,可通过重定向或自定义函数实现:

const fs = require('fs');
const path = require('path');
const logFile = path.join(__dirname, 'app.log');

// 自定义日志函数(带时间戳)
function logToFile(message) {
  const timestamp = new Date().toISOString();
  const logEntry = `${timestamp}: ${message}\n`;
  fs.appendFile(logFile, logEntry, (err) => {
    if (err) throw err;
  });
}

// 重写console.log
console.log = (...args) => {
  const message = args.join(' ');
  logToFile(message); // 写入文件
  process.stdout.write(message + '\n'); // 同时输出到控制台
};

// 示例使用
console.log('Hello, world!');

缺点:缺乏日志级别、格式化、轮转等功能,不适合生产环境。

二、使用日志库:Winston/Pino(推荐)

1. Winston(功能全面)

Winston是Node.js最流行的日志库,支持多传输(文件、控制台、Syslog等)、格式化(JSON/文本)和日志级别。

  • 安装npm install winston
  • 配置示例
    const { createLogger, format, transports } = require('winston');
    const path = require('path');
    
    const logger = createLogger({
      level: process.env.LOG_LEVEL || 'info', // 通过环境变量动态设置级别
      format: format.combine(
        format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
        format.json() // 生产环境建议用JSON格式(便于ELK等工具分析)
      ),
      transports: [
        new transports.File({ filename: path.join(__dirname, 'logs/error.log'), level: 'error' }), // 错误日志单独存储
        new transports.File({ filename: path.join(__dirname, 'logs/combined.log') }), // 所有日志合并
        ...(process.env.NODE_ENV !== 'production' ? [ // 开发环境输出到控制台
          new transports.Console({ format: format.simple() })
        ] : [])
      ]
    });
    
    // 示例使用
    logger.info('Application started');
    logger.error('Database connection failed');
    
  • 优势:灵活、可扩展,支持自定义传输和格式化。

2. Pino(高性能)

Pino专注于高性能,日志输出为JSON格式,适合对性能敏感的生产环境。

  • 安装npm install pino pino-pretty
  • 配置示例
    const pino = require('pino');
    const path = require('path');
    
    // 生产环境:写入文件
    const logger = pino({ level: 'info' }, pino.destination(path.join(__dirname, 'logs/app.log')));
    
    // 开发环境:输出到控制台(美化格式)
    if (process.env.NODE_ENV !== 'production') {
      logger.level = 'debug';
      logger = pino({ level: 'debug' }, pino.destination(process.stdout));
    }
    
    // 示例使用
    logger.info('User logged in', { userId: 123 });
    logger.error('Invalid API key', { apiKey: 'abc123' });
    
  • 优势:日志输出速度快,资源占用低。

三、日志轮转:防止日志文件过大

使用logrotate工具自动轮转、压缩和删除旧日志,避免日志文件占用过多磁盘空间。

  • 安装sudo apt install logrotate
  • 配置:创建/etc/logrotate.d/nodejs文件,内容如下:
    /path/to/your/nodejs/logs/*.log {
      daily                # 每天轮转
      rotate 7             # 保留7天日志
      compress             # 压缩旧日志(如.gz格式)
      missingok            # 若日志文件不存在也不报错
      notifempty           # 若日志为空则不轮转
      create 0644 root root # 新日志文件权限
    }
    
  • 测试logrotate -d /etc/logrotate.d/nodejs(模拟运行,检查配置是否正确);logrotate -f /etc/logrotate.d/nodejs(强制立即轮转)。

四、进程管理:PM2集成日志

PM2是Node.js进程管理工具,可自动重启应用并管理日志,适合生产环境。

  • 安装npm install pm2 -g
  • 启动应用并配置日志
    pm2 start app.js --name "my-app" \
      --log /var/log/my-app.log \       # 合并日志路径
      --error /var/log/my-app-error.log # 错误日志路径
    
  • 查看日志pm2 logs my-app(实时日志);pm2 logs my-app --lines 100(查看最近100条)。
  • 配置文件:也可通过ecosystem.config.js配置:
    module.exports = {
      apps: [{
        name: 'my-app',
        script: 'app.js',
        error_file: '/var/log/my-app-error.log',
        out_file: '/var/log/my-app.log',
        log_date_format: 'YYYY-MM-DD HH:mm Z'
      }]
    };
    
  • 优势:自动管理进程、日志分割、支持远程日志(如Logstash)。

五、系统日志集成:Syslog

将Node.js日志发送到Debian系统的Syslog(集中管理所有系统日志),适合需要统一日志管理的场景。

  • 使用Winston-Syslog
    • 安装npm install winston-syslog
    • 配置示例
      const winston = require('winston');
      const Syslog = require('winston-syslog').Syslog;
      
      const logger = winston.createLogger({
        level: 'info',
        format: winston.format.json(),
        transports: [
          new Syslog({
            host: 'localhost',    // Syslog服务器地址(本地则为localhost)
            port: 514,            // Syslog端口(默认UDP 514)
            app_name: 'my-node-app', // 应用名称(在Syslog中标识)
            facility: 'local0',   // 设施类型(如local0-local7)
            eol: '\n'             // 行结束符
          })
        ]
      });
      
      // 示例使用
      logger.info('Application started', { pid: process.pid });
      
  • 查看Syslogjournalctl -t my-node-app(过滤应用名称);tail -f /var/log/syslog(查看系统日志)。

六、环境变量配置日志级别

通过环境变量动态调整日志级别,无需修改代码即可适应不同环境(开发/测试/生产)。

  • 示例
    const winston = require('winston');
    
    const logger = winston.createLogger({
      level: process.env.LOG_LEVEL || 'info', // 默认info级别
      format: winston.format.json(),
      transports: [new winston.transports.Console()]
    });
    
    // 启动应用时设置环境变量
    // 生产环境:LOG_LEVEL=error node app.js
    // 开发环境:LOG_LEVEL=debug node app.js
    
  • 优势:灵活控制日志详细程度,减少生产环境不必要的日志输出。

七、自定义日志存储路径

通过代码或配置文件指定日志存储位置,确保日志文件存放在合适目录(如/var/log)。

  • 代码配置(Winston示例)
    const path = require('path');
    const winston = require('winston');
    
    const logger = winston.createLogger({
      transports: [
        new winston.transports.File({ 
          filename: path.join('/var/log', 'my-app', 'combined.log') // 绝对路径
        })
      ]
    });
    
  • 配置文件(config.json)
    {
      "logPath": "/var/log/my-app/app.log"
    }
    
    代码中读取:
    const config = require('./config.json');
    const logPath = path.resolve(__dirname, config.logPath);
    
  • 注意事项:确保应用对日志目录有写入权限(如sudo chown -R nodeuser:nodegroup /var/log/my-app)。

以上方法覆盖了Debian系统下Node.js日志配置的主要场景,可根据应用规模、性能需求选择合适的方案。生产环境推荐使用Winston/Pino+PM2+logrotate组合,实现日志的结构化、持久化和高效管理。

0