温馨提示×

Ubuntu Nodejs 日志管理怎么做

小樊
59
2025-09-18 10:57:26
栏目: 编程语言

Ubuntu环境下Node.js日志管理方案

1. 基础日志记录:使用内置console模块

Node.js内置的console模块是最简单的日志记录方式,适合开发调试。通过console.log()输出普通信息,console.error()输出错误信息,日志会直接显示在终端或重定向到文件(如node app.js > app.log 2>&1)。但这种方式缺乏日志级别、格式化和长期管理功能,仅适用于临时调试。

2. 第三方日志库:结构化与定制化

第三方日志库提供了日志级别、格式化、传输(文件/控制台/HTTP)等功能,适合生产环境:

  • Winston:最流行的日志库,支持多传输方式(文件、控制台、数据库等)、日志级别(info/warn/error等)和自定义格式。示例配置:
    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' }), // 所有日志合并
        new winston.transports.Console({ format: winston.format.simple() }) // 控制台输出(开发环境)
      ]
    });
    logger.info('Application started'); // 记录info日志
    
  • Bunyan:以结构化JSON日志为核心,便于日志聚合和分析。示例:
    const bunyan = require('bunyan');
    const logger = bunyan.createLogger({ name: 'myapp' }); // 日志名称
    logger.info({ user: 'John' }, 'User logged in'); // 带上下文的日志
    
  • Pino:主打高性能(比Winston快3倍以上),日志以JSON格式输出,支持异步记录。示例:
    const pino = require('pino')();
    pino.info('This is a log message'); // 自动添加时间戳、日志级别
    
  • Log4js:功能丰富,支持日志轮转、多appender(文件、数据库、邮件等),适合复杂应用。示例:
    const log4js = require('log4js');
    log4js.configure({
      appenders: {
        file: { type: 'file', filename: 'app.log', pattern: '-yyyy-MM-dd', keepFileExt: true }, // 按天轮转
        console: { type: 'console' }
      },
      categories: { default: { appenders: ['file', 'console'], level: 'info' } }
    });
    const logger = log4js.getLogger();
    logger.info('Log4js is working');
    

这些库均支持日志级别过滤(如仅记录error及以上级别)、结构化日志(便于ELK等工具分析)和多传输目标(文件+控制台+远程服务器)。

3. 日志轮转:防止日志文件过大

当日志文件过大时,需通过轮转分割文件,避免占用过多磁盘空间。Ubuntu下常用logrotate工具:

  • 安装:sudo apt-get install logrotate
  • 配置:创建/etc/logrotate.d/nodejs文件,添加以下内容(针对Node.js日志目录):
    /var/log/nodejs/*.log {
      daily                # 每天轮转
      missingok            # 日志文件不存在时不报错
      rotate 7             # 保留最近7天的日志
      compress             # 压缩旧日志(.gz格式)
      notifempty           # 日志为空时不轮转
      create 0640 root adm # 新日志文件权限
    }
    
  • 测试:sudo logrotate -vf /etc/logrotate.d/nodejs(强制立即轮转)。
    也可通过PM2内置轮转(见下文)或日志库自身功能(如Winston的winston-daily-rotate-file插件)实现。

4. 进程管理器:PM2的日志管理功能

PM2是Node.js进程管理工具,内置日志管理功能,适合生产环境:

  • 安装:sudo npm install pm2 -g
  • 启动应用并记录日志:pm2 start app.js --name my-app(自动生成out.log(标准输出)和err.log(错误输出))
  • 常用命令:
    • pm2 logs my-app:实时查看日志(--lines 100限制行数,--follow持续跟踪)
    • pm2 logs --json:以JSON格式输出(便于后续处理)
    • pm2 flush:清空当前日志
  • 配置日志轮转:通过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', // 日志时间格式
        merge_logs: true, // 合并stdout和stderr
        log_rotation: true, // 开启轮转
        log_rotation_interval: '1d', // 每天轮转
        log_rotation_size: '10M', // 单个文件超过10M时轮转
        log_rotation_keep: 7 // 保留7个轮转文件
      }]
    };
    
    启动:pm2 start ecosystem.config.js

5. 系统日志集成:rsyslog/syslog-ng

将Node.js日志发送到系统日志(/var/log/syslog/var/log/messages),统一管理:

  • 安装rsyslog:sudo apt-get install rsyslog(Ubuntu默认安装)
  • 配置:编辑/etc/rsyslog.d/50-default.conf,添加以下内容(将node程序的日志发送到/var/log/nodejs.log):
    if $programname == 'node' then /var/log/nodejs.log
    & stop # 停止后续处理(避免重复记录)
    
  • 重启rsyslog:sudo systemctl restart rsyslog
  • 查看日志:tail -f /var/log/nodejs.log
    需在Node.js应用中配置日志传输(如Winston的transports.Consolewinston-syslog插件)。

6. 高级日志分析:ELK/Graylog等工具

对于大规模应用,可使用日志分析平台实现集中存储、可视化和告警:

  • ELK Stack(Elasticsearch+Logstash+Kibana)
    • Logstash收集Node.js日志(通过file input插件),Elasticsearch存储并索引,Kibana可视化分析(如错误趋势、请求耗时)。
    • 配置:需安装Logstash的file input插件,解析JSON格式日志(Winston/Bunyan输出的JSON可直接解析)。
  • Graylog
    • 开源日志管理平台,支持日志收集(GELF格式)、存储(MongoDB/Elasticsearch)、分析和告警(如错误率超过阈值时发送邮件)。
    • 配置:Node.js应用通过winston-graylog2bunyan-graylog插件发送GELF格式日志到Graylog服务器。
  • Loki+Grafana
    • 云原生日志聚合系统,轻量级(适合Kubernetes环境),与Grafana集成实现可视化。
    • 配置:使用promtail收集日志(支持Node.js JSON格式),发送到Loki,通过Grafana展示日志面板。

以上方案覆盖了Ubuntu下Node.js日志管理的记录、轮转、进程管理、系统集成、分析全流程,可根据应用规模(开发/生产)、需求(简单/复杂)选择合适的组合(如开发用console+Winston,生产用PM2+logrotate+ELK)。

0