温馨提示×

Ubuntu环境下Node.js日志如何管理

小樊
37
2025-12-08 00:08:34
栏目: 编程语言

Ubuntu下Node.js日志管理实践

一 核心原则与总体架构

  • 使用结构化日志:优先选择成熟的日志库,如 Winston、Pino、Bunyan,便于控制日志级别(如 error、warn、info、debug)、输出格式与多目标输出(文件、控制台、HTTP 等)。结构化(如 JSON)更利于后续检索与分析。
  • 做好日志轮转与保留:按时间/大小切分,压缩归档,设置保留天数,避免磁盘被撑满。
  • 集中式收集与分析:在分布式或生产环境,将日志发送到 ELK Stack(Elasticsearch、Logstash、Kibana)Graylog 等平台,统一检索、可视化与告警。
  • 运行与监控:使用 PM2 等进程管理器统一管理进程与日志,便于自动重启、实时查看与故障告警

二 应用内日志方案与示例

  • 使用 Winston 记录文件与控制台日志(开发/生产一致,便于排错与归档)
    • 安装:npm install winston
    • 示例:
      const winston = require('winston');
      
      const logger = winston.createLogger({
        level: process.env.NODE_ENV === 'production' ? 'info' : 'debug',
        format: winston.format.combine(
          winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
          winston.format.json()
        ),
        transports: [
          new winston.transports.File({ filename: 'logs/error.log', level: 'error' }),
          new winston.transports.File({ filename: 'logs/combined.log' }),
        ],
      });
      
      if (process.env.NODE_ENV !== 'production') {
        logger.add(new winston.transports.Console({
          format: winston.format.simple()
        }));
      }
      
      logger.info('应用启动', { pid: process.pid });
      logger.error('发生错误', { err: new Error('boom') });
      
  • 使用 Pino 记录高性能结构化日志(适合高并发)
    • 安装:npm install pino
    • 示例:
      const pino = require('pino')();
      pino.info({ service: 'api' }, 'hello pino');
      
  • Express 场景结合 HTTP 访问日志(morgan + winston)
    • 安装:npm install morgan winston
    • 示例:
      const express = require('express');
      const morgan = require('morgan');
      const logger = require('./logger'); // 上面的 winston 实例
      
      const app = express();
      app.use(morgan('combined', { stream: { write: msg => logger.info(msg.trim()) } }));
      app.get('/', (_, res) => res.send('ok'));
      app.listen(3000);
      
  • 日志级别建议:开发环境用 debug,生产环境用 info/error;按需细化到 warn/verbose

三 日志轮转与保留策略

  • 应用内轮转(推荐与系统方案二选一或叠加):使用 winston-daily-rotate-file

    • 安装:npm install winston-daily-rotate-file
    • 示例:
      const DailyRotateFile = require('winston-daily-rotate-file');
      
      const rotateTransport = new DailyRotateFile({
        filename: 'logs/application-%DATE%.log',
        datePattern: 'YYYY-MM-DD',
        zippedArchive: true,
        maxSize: '20m',
        maxFiles: '14d'
      });
      
      logger.add(rotateTransport);
      
    • 说明:按天切分、超过 20MB 切分、保留 14 天、旧文件压缩归档。
  • 系统级轮转(与应用解耦,推荐生产使用):使用 logrotate

    • 新建配置:sudo nano /etc/logrotate.d/nodejs-app
    • 示例配置(按天轮转、保留 7 天、压缩、延迟压缩、空文件不轮转、自动创建新文件):
      /path/to/your/node-app/logs/*.log {
        daily
        rotate 7
        compress
        delaycompress
        missingok
        notifempty
        create 0640 root adm
      }
      
    • 测试与生效:sudo logrotate -f /etc/logrotate.d/nodejs-app
    • 说明:该方式对应用透明,适合多进程/多实例或容器化部署。

四 运行与集中式日志

  • 使用 PM2 管理进程与日志
    • 安装:npm install -g pm2
    • 常用命令:
      pm2 start app.js --name my-app
      pm2 logs my-app            # 实时查看
      pm2 monit                 # 资源与日志监控
      pm2 flush                 # 清理当前日志
      
    • 日志轮转(PM2 内置):
      pm2 set pm2:log-date-format "YYYY-MM-DD HH:mm:ss"
      pm2 set pm2:max-size "20M"
      pm2 set pm2:retain "14d"
      
  • 集中式日志收集
    • 方案:将日志发送到 rsyslog 或直接到 ELK/Graylog
    • rsyslog 示例(将标识为 nodejs 的日志写入文件):
      sudo apt-get install rsyslog
      # /etc/rsyslog.d/50-default.conf 追加:
      if $programname == 'nodejs' then /var/log/nodejs.log
      & stop
      sudo systemctl restart rsyslog
      
    • 后续可在 Kibana 中建立索引模式进行检索与可视化。

五 维护与最佳实践清单

  • 目录与权限:日志目录统一(如 /var/log/myapp/ 或项目内 logs/),设置合适权限(如 0640),避免敏感信息写入日志。
  • 保留与清理:按合规设置保留周期(如 7–14 天),结合 logrotate 或应用内轮转策略自动清理。
  • 性能与异步:避免同步写日志与过重序列化,高并发优先 Pino 或异步传输。
  • 结构化与采样:统一 JSON 字段(如 timestamp、level、service、trace_id),异常场景适当增加采样与上下文。
  • 监控与告警:对 error 级别日志建立监控与告警(如对接 Sentry、Prometheus + Alertmanager)。
  • 安全合规:脱敏敏感字段(如 password、token、card),限制日志访问权限,定期审计。

0