linux

Linux下Node.js日志配置与管理

小樊
37
2025-11-08 20:40:06
栏目: 编程语言

Linux下Node.js日志配置与管理指南

一、基础日志输出:内置console模块

Node.js内置的console模块是最简单的日志输出方式,适用于开发调试阶段。通过console.log()输出普通信息,console.error()输出错误信息,日志直接显示在终端或重定向到文件(如node app.js > app.log 2>&1)。
缺点:缺乏日志级别控制、格式化功能和持久化策略,不适合生产环境。

二、第三方日志库:结构化与功能扩展

1. Winston:通用型日志库

Winston是Node.js最流行的日志库,支持多传输目标(控制台、文件、HTTP、数据库等)、日志级别(error、warn、info、debug等)和结构化日志(JSON格式)。
配置示例

const winston = require('winston');
const logger = winston.createLogger({
  level: process.env.LOG_LEVEL || 'info', // 通过环境变量动态设置级别
  format: winston.format.combine(
    winston.format.timestamp(), // 添加时间戳
    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('Server started on port 3000');
logger.error('Database connection failed');

特点:功能全面,适合大多数生产场景;可通过winston-daily-rotate-file插件实现日志轮转。

2. Pino:高性能日志库

Pino以极致性能著称(比Winston快3倍以上),适合高负载应用(如实时系统、微服务)。默认输出JSON格式,支持pino-pretty插件美化终端输出。
配置示例

const pino = require('pino');
const logger = pino({
  level: 'info',
  transport: {
    target: 'pino-pretty', // 终端美化输出
    options: { colorize: true } // 彩色日志
  }
});
logger.info('User logged in', { userId: 123 }); // 结构化日志(带上下文)
logger.error('Invalid request', { statusCode: 400, path: '/login' });

特点:低开销,适合对性能敏感的场景;结构化日志便于后续分析。

3. Bunyan:结构化日志标杆

Bunyan输出JSON格式日志,便于与日志分析工具(如ELK、Splunk)集成,适合企业级应用。
配置示例

const bunyan = require('bunyan');
const logger = bunyan.createLogger({
  name: 'my-app', // 应用名称(日志标识)
  level: 'info',
  streams: [
    { level: 'info', stream: process.stdout }, // 输出到控制台
    { level: 'error', path: 'app-error.log' } // 错误日志写入文件
  ]
});
logger.info('Request received', { method: 'GET', url: '/api/users' });
logger.error('Server error', { err: new Error('Internal Server Error') });

特点:结构化日志标准化,适合复杂系统;支持日志流(如写入文件、远程服务器)。

三、日志轮转:防止日志膨胀

日志文件过大会占用大量磁盘空间,需通过轮转策略(按时间/大小分割、压缩、删除旧日志)解决。Linux系统自带logrotate工具是首选。
配置步骤

  1. 安装logrotate(如未安装):sudo apt-get install logrotate(Ubuntu/Debian)或sudo yum install logrotate(CentOS/RHEL)。
  2. 创建配置文件(如/etc/logrotate.d/nodejs):
    /var/log/nodejs/*.log { # 匹配日志路径(需替换为实际路径)
      daily                 # 每天轮转
      rotate 7              # 保留最近7天日志
      compress              # 压缩旧日志(.gz格式)
      missingok             # 日志文件不存在时不报错
      notifempty            # 日志为空时不轮转
      create 0640 root adm  # 新日志文件权限和所有者
    }
    
  3. 测试配置:sudo logrotate -vf /etc/logrotate.d/nodejs(强制立即轮转)。
    效果:每天生成新的日志文件(如app.log.2025-11-08.gz),保留7天内的压缩日志,节省存储空间。

四、进程管理工具:PM2的日志管理

PM2是Node.js进程管理工具,内置日志聚合轮转实时流功能,适合生产环境部署。
常用命令

pm2 start app.js --name "my-app" # 启动应用并命名
pm2 logs my-app                  # 实时查看所有日志(控制台输出+文件日志)
pm2 logs my-app --lines 100      # 查看最近100行日志
pm2 save                         # 保存当前进程列表(防止重启丢失)
pm2 startup                      # 设置开机自启

日志轮转配置(通过PM2配置文件ecosystem.config.js):

module.exports = {
  apps: [{
    name: 'my-app',
    script: 'app.js',
    log_date_format: 'YYYY-MM-DD HH:mm Z', // 日志时间格式
    out_file: '/var/log/nodejs/my-app.log', // 标准输出日志路径
    error_file: '/var/log/nodejs/my-app-error.log', // 错误输出日志路径
    merge_logs: true, // 合并stdout和stderr
    log_rotate: true, // 开启轮转
    log_size: '10M', // 单个日志文件最大10MB
    log_retain: 7    // 保留7个日志文件
  }]
};

特点:简化日志管理流程,支持集群模式下的日志聚合,适合分布式系统。

五、集中式日志管理:ELK Stack

对于分布式系统或多节点应用,集中式日志管理是必要的。ELK Stack(Elasticsearch + Logstash + Kibana)是经典解决方案,可实现日志收集、存储、搜索和可视化。
配置步骤

  1. 安装组件:分别安装Elasticsearch(日志存储和搜索引擎)、Logstash(日志收集和处理)、Kibana(日志可视化)。
  2. 修改Node.js日志输出:使用Winston或Pino将日志发送到Logstash(通过TCP/UDP或HTTP接口)。例如,Winston配置:
    const winston = require('winston');
    require('winston-logstash').Logstash; // 引入Logstash传输
    
    const logger = winston.createLogger({
      transports: [
        new winston.transports.Logstash({
          port: 5000, // Logstash监听端口
          host: 'localhost', // Logstash服务器地址
          max_connect_retries: -1 // 无限重试
        })
      ]
    });
    
  3. Kibana可视化:登录Kibana(默认端口5601),创建索引模式(如nodejs-*),通过Dashboard展示日志趋势、错误统计等。
    优势:支持大规模日志分析,便于故障排查和业务监控;可与其他系统(如Prometheus、Grafana)集成。

六、最佳实践总结

  1. 日志级别分离:开发环境用debug(详细信息),生产环境用info(关键流程)或error(仅错误),避免日志冗余。
  2. 结构化日志:使用JSON格式,包含timestamplevelmessagecontext(如用户ID、请求ID)等字段,便于后续分析。
  3. 日志轮转:通过logrotate或PM2配置,防止日志文件过大导致磁盘空间耗尽。
  4. 集中式管理:对于多节点应用,使用ELK或Grafana Loki集中存储和分析日志,提升运维效率。
  5. 敏感信息过滤:使用cabin.js等库自动屏蔽日志中的敏感字段(如密码、信用卡号),避免信息泄露。

0
看了该问题的人还看了