温馨提示×

Ubuntu如何配置Node.js日志输出

小樊
56
2025-08-29 04:15:23
栏目: 编程语言

Ubuntu系统配置Node.js日志输出的常见方法

1. 使用内置console模块(基础调试)

Node.js内置的console.log()console.error()等方法是最简单的日志输出方式,适合开发阶段快速查看信息。日志默认输出到终端,可通过重定向到文件保存(如node app.js > app.log 2>&1)。但这种方式缺乏日志级别、格式化等功能,不适合生产环境。

2. 使用第三方日志库(推荐生产环境)

Winston

Winston是Node.js最流行的日志库,支持多传输方式(控制台、文件、HTTP等)、日志级别(info/warn/error等)和自定义格式

  • 安装:npm install winston
  • 基础配置示例:
    const winston = require('winston');
    const logger = winston.createLogger({
      level: process.env.LOG_LEVEL || 'info', // 通过环境变量控制日志级别
      format: winston.format.combine(
        winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), // 添加时间戳
        winston.format.json() // 结构化输出(便于后续分析)
      ),
      transports: [
        new winston.transports.Console(), // 输出到控制台(开发环境)
        new winston.transports.File({ filename: 'error.log', level: 'error' }), // 错误日志单独保存
        new winston.transports.File({ filename: 'combined.log' }) // 所有日志合并保存
      ]
    });
    
    // 使用示例
    logger.info('Application started');
    logger.error('Database connection failed');
    
  • 日志轮转:为避免日志文件过大,可安装winston-daily-rotate-file插件,配置按天分割日志:
    const DailyRotateFile = require('winston-daily-rotate-file');
    const transport = new DailyRotateFile({
      filename: 'application-%DATE%.log', // 文件名包含日期
      datePattern: 'YYYY-MM-DD', // 按天分割
      zippedArchive: true, // 压缩旧日志
      maxSize: '20m', // 单个文件最大20MB
      maxFiles: '14d' // 保留14天
    });
    logger.add(transport);
    

Pino

Pino以高性能著称,适合高负载应用,支持JSON格式输出和流式处理。

  • 安装:npm install pino
  • 基础配置示例:
    const pino = require('pino')();
    pino.info('Hello, world!');
    pino.error('Something went wrong');
    

Log4js

Log4js是功能丰富的日志库,支持日志分级(trace/debug/info等)、文件轮转多种输出目标

  • 安装:npm install log4js
  • 基础配置示例:
    const log4js = require('log4js');
    log4js.configure({
      appenders: {
        console: { type: 'console' }, // 控制台输出
        file: { 
          type: 'file', 
          filename: 'logs/app.log', 
          pattern: '-yyyy-MM-dd', // 按天分割
          alwaysIncludePattern: true,
          daysToKeep: 90, // 保留90天
          compress: true // 压缩旧日志
        }
      },
      categories: {
        default: { appenders: ['console', 'file'], level: 'info' } // 默认日志级别
      }
    });
    const logger = log4js.getLogger();
    logger.info('Application initialized');
    

3. 使用PM2进程管理器(生产环境必备)

PM2是Node.js进程管理工具,可自动重启应用、管理日志,并提供日志轮转功能。

  • 安装:npm install pm2 -g
  • 启动应用并配置日志:
    pm2 start app.js --name my-app --log-date-format "YYYY-MM-DD HH:mm Z" # 添加时间戳
    
  • 日志管理命令:
    • 查看实时日志:pm2 logs my-app
    • 保存日志到文件:pm2 save + pm2 logs > all.log
    • 配置日志轮转(限制大小和数量):
      pm2 set pm2-logrotate:max_size 10M # 单个日志文件最大10MB
      pm2 set pm2-logrotate:retain 7 # 保留7天
      

4. 输出到系统日志(Rsyslog)

将Node.js日志发送到Ubuntu的Rsyslog系统日志服务,便于统一管理所有系统日志。

  • 安装winston-syslog模块:npm install winston-syslog
  • 配置示例:
    const winston = require('winston');
    require('winston-syslog').Syslog;
    
    const logger = winston.createLogger({
      transports: [
        new winston.transports.Syslog({
          host: 'localhost', // 本地系统日志服务器
          port: 514,
          protocol: 'udp', // 或'tcp'
          facility: 'user', // 日志设施(如user/local0)
          appName: 'my-node-app', // 应用名称(在系统日志中标识)
          level: 'info'
        })
      ]
    });
    
    logger.info('Log sent to system log');
    
  • 查看系统日志:journalctl -u my-node-app(若配置了syslog标识)或tail -f /var/log/syslog

5. 使用环境变量控制日志配置

通过环境变量灵活调整日志级别、输出路径等参数,适应不同环境(开发/测试/生产)。

  • 示例代码:
    const winston = require('winston');
    const logLevel = process.env.LOG_LEVEL || 'info'; // 默认info级别
    const logPath = process.env.LOG_PATH || './logs'; // 默认日志路径
    
    const logger = winston.createLogger({
      level: logLevel,
      format: winston.format.combine(
        winston.format.timestamp(),
        winston.format.json()
      ),
      transports: [
        new winston.transports.Console(),
        new winston.transports.File({ filename: `${logPath}/combined.log` }),
        new winston.transports.File({ 
          filename: `${logPath}/error.log`, 
          level: 'error' 
        })
      ]
    });
    
  • 启动应用时设置环境变量:
    LOG_LEVEL=debug LOG_PATH=./logs node app.js
    

以上方法可根据应用场景组合使用(如Winston+PM2+日志轮转),实现灵活、高效的日志管理。生产环境建议优先选择Winston或Pino搭配PM2,兼顾性能和易用性。

0