温馨提示×

Node.js在Ubuntu中如何进行日志管理

小樊
46
2025-09-29 04:04:05
栏目: 编程语言

Node.js在Ubuntu中的日志管理方案

一、基础日志记录:内置模块与第三方库

Node.js内置console模块可用于快速输出日志(如console.log()console.error()),但更适合开发调试。生产环境中建议使用第三方日志库,提供更强大的功能(如日志级别、格式化、多输出目标):

  • Winston:最流行的日志库之一,支持控制台、文件、HTTP等多种传输方式,可配置日志级别(如infoerror)和JSON格式输出。示例配置:
    const winston = require('winston');
    const logger = winston.createLogger({
      level: 'info',
      format: winston.format.json(),
      transports: [
        new winston.transports.File({ filename: 'error.log', level: 'error' }), // 错误日志单独存储
        new winston.transports.File({ filename: 'combined.log' }) // 所有日志合并
      ]
    });
    if (process.env.NODE_ENV !== 'production') {
      logger.add(new winston.transports.Console({ format: winston.format.simple() })); // 开发环境输出到控制台
    }
    
  • Bunyan:轻量级JSON日志库,日志输出为结构化格式,便于后续处理。示例:
    const bunyan = require('bunyan');
    const logger = bunyan.createLogger({ name: 'my-app', level: 'info' });
    logger.info('This is an info log'); // 输出JSON格式日志
    

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

日志轮转可自动分割日志文件(按大小或时间),压缩旧日志并保留指定数量,避免磁盘空间耗尽。常见方法:

  • Winston-Daily-Rotate-File:Winston的扩展插件,支持按日期/大小轮转。配置示例:
    const DailyRotateFile = require('winston-daily-rotate-file');
    const transport = new DailyRotateFile({
      filename: 'application-%DATE%.log', // 日志文件名模板(%DATE%替换为日期)
      datePattern: 'YYYY-MM-DD', // 按天分割
      zippedArchive: true, // 压缩旧日志
      maxSize: '20m', // 单个文件最大20MB
      maxFiles: '14d' // 保留14天日志
    });
    const logger = winston.createLogger({ transports: [transport] });
    
  • Logrotate工具(系统级):Ubuntu自带的日志管理工具,可管理Node.js及其他应用的日志。创建配置文件/etc/logrotate.d/nodejs
    /var/log/nodejs/*.log {
      daily # 每天轮转
      missingok # 文件不存在时不报错
      rotate 7 # 保留7天日志
      compress # 压缩旧日志
      notifempty # 日志为空时不轮转
      create 0640 root adm # 新日志文件权限
    }
    

三、进程管理器:增强日志管理能力

使用PM2(进程管理器)可简化Node.js应用管理,提供日志收集、实时查看、自动重启等功能:

  • 安装与启动:npm install pm2 -g,启动应用:pm2 start app.js --name my-app
  • 日志查看:pm2 logs my-app(实时查看所有日志);pm2 logs my-app --lines 100(查看最近100行)。
  • 日志配置:通过ecosystem.config.js自定义日志路径和轮转:
    module.exports = {
      apps: [{
        name: 'my-app',
        script: 'app.js',
        out_file: '/var/log/nodejs/my-app-out.log', // 标准输出日志路径
        error_file: '/var/log/nodejs/my-app-err.log', // 错误输出日志路径
        log_date_format: 'YYYY-MM-DD HH:mm:ss', // 日志时间格式
        log_rotation: true, // 启用轮转
        log_rotation_interval: '1d', // 每天轮转
        log_rotation_size: '10M' // 单个文件最大10MB
      }]
    };
    

四、集中式日志管理:分布式系统解决方案

对于生产环境,建议使用集中式日志管理(如ELK Stack、Graylog),将日志收集、存储、分析统一管理:

  • ELK Stack(Elasticsearch + Logstash + Kibana)
    1. Logstash收集日志:通过Filebeat(轻量级日志采集器)将Node.js日志发送到Logstash。
    2. Elasticsearch存储与索引:Logstash将日志解析后存入Elasticsearch,支持快速检索。
    3. Kibana可视化:通过Kibana创建 dashboard,实现日志的实时分析与可视化(如错误率统计、请求耗时分析)。
  • 配置示例:在Node.js应用中添加Logstash传输(使用winston-logstash库):
    const winston = require('winston');
    const Logstash = require('winston-logstash').Logstash;
    const logger = winston.createLogger({
      transports: [
        new Logstash({ port: 5000, host: 'localhost' }) // 连接到本地的Logstash服务
      ]
    });
    

五、日志存储路径与权限管理

  • 默认路径:若未配置,日志通常存储在应用所在目录的logs子目录(如./logs/app.log)。
  • 自定义路径:通过代码或配置文件指定(如Winston的filename选项、PM2的out_file配置)。
  • 权限设置:确保日志目录可写(如mkdir -p /var/log/nodejs && chown -R $USER:adm /var/log/nodejs),避免权限问题导致日志无法写入。

0