温馨提示×

如何配置Ubuntu JS日志记录策略

小樊
36
2025-12-23 19:02:40
栏目: 编程语言

Ubuntu 上 Node.js 日志策略配置指南

一 核心策略与选型

  • 日志库选型:优先使用结构化日志库,如 Winston(功能全面、多传输)、Pino(高性能)、Bunyan(默认 JSON、配套 CLI)。Express 场景可配合 Morgan 记录 HTTP 请求日志。
  • 日志级别:按环境动态设置,常见级别为 debug / info / warn / error / fatal,生产环境建议默认 infowarn
  • 输出目标:开发期输出到控制台便于排查;生产期建议写入文件并接入集中式系统。
  • 轮转与保留:避免单文件过大,按天/按大小轮转并保留有限历史。
  • 集中化与监控:将日志发送至 ELK Stack(Elasticsearch、Logstash、Kibana)Graylog,结合 Prometheus + Grafana 做告警与可视化。
  • 安全合规:避免记录敏感信息(如密码、密钥),设置合适的文件权限,必要时加密传输。

二 应用内日志配置示例

  • 使用 Winston 的文件轮转(按天/按大小)
    • 安装依赖:npm i winston winston-daily-rotate-file
    • 配置示例:
      const { createLogger, format, transports } = require('winston');
      const DailyRotateFile = require('winston-daily-rotate-file');
      
      const logger = createLogger({
        level: process.env.LOG_LEVEL || 'info',
        format: format.combine(
          format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
          format.json()
        ),
        defaultMeta: { service: 'my-app' },
        transports: [
          new DailyRotateFile({
            filename: '/var/log/myapp/application-%DATE%.log',
            datePattern: 'YYYY-MM-DD',
            zippedArchive: true,
            maxSize: '20m',
            maxFiles: '14d'
          }),
          new transports.Console({ format: format.simple() })
        ]
      });
      
      logger.info('服务启动', { port: 3000 });
      logger.error('数据库不可用', { err: err.message });
      
  • Express + Morgan(HTTP 请求日志)
    • 安装:npm i morgan
    • 配置示例:
      const express = require('express');
      const morgan = require('morgan');
      const fs = require('fs');
      const path = require('path');
      
      const app = express();
      const accessLogStream = fs.createWriteStream(
        path.join(__dirname, 'logs', 'access.log'), { flags: 'a' }
      );
      
      app.use(morgan('combined', { stream: accessLogStream }));
      app.get('/', (req, res) => res.send('Hello World'));
      app.listen(3000);
      
  • 环境变量控制日志级别
    • 启动时设置:LOG_LEVEL=debug node app.js
    • 代码中读取:level: process.env.LOG_LEVEL || ‘info’

三 运行方式与系统日志集成

  • 使用 PM2 管理进程与日志
    • 安装:npm i -g pm2
    • 启动与查看:pm2 start app.js --name my-app;pm2 logs my-app(支持实时 tail、按服务过滤)
  • 使用 systemd 托管并写入系统日志
    • 示例服务单元(/etc/systemd/system/myapp.service)
      [Unit]
      Description=My Node.js App
      After=network.target
      
      [Service]
      Type=simple
      User=www-data
      WorkingDirectory=/opt/myapp
      ExecStart=/usr/bin/node /opt/myapp/app.js
      Restart=always
      StandardOutput=journal
      StandardError=journal
      SyslogIdentifier=myapp
      
      [Install]
      WantedBy=multi-user.target
      
    • 查看:journalctl -u myapp.service -f

四 日志轮转与自动清理

  • 使用 logrotate 管理应用日志文件
    • 新建配置:/etc/logrotate.d/nodejs-app
      /var/log/myapp/*.log {
        daily
        missingok
        rotate 7
        compress
        notifempty
        create 0640 www-data adm
        copytruncate
      }
      
    • 说明:daily 每天轮转;rotate 7 保留 7 份;compress 压缩旧日志;create 设定新文件权限与属主;copytruncate 避免应用重开文件句柄(如应用不支持信号重新打开日志)。
    • 测试:sudo logrotate -f /etc/logrotate.d/nodejs-app
  • 使用 systemd 定时器清理旧日志(可选)
    • 清理脚本:/usr/local/bin/clean-nodejs-logs.sh
      #!/usr/bin/env bash
      LOG_DIR="/var/log/myapp"
      find "$LOG_DIR" -type f -name "*.gz" -mtime +7 -delete
      
    • 定时器与单元:clean-nodejs-logs.timer / clean-nodejs-logs.service,配置 OnCalendar=daily 并启用。

五 集中化与监控实践

  • 将日志发送到 ELK:在 Winston 中增加 Elasticsearch 传输或使用 Logstash 收集后入库,在 Kibana 建立索引模式与可视化面板。
  • 使用 PM2 内置日志聚合与查看:pm2 logs 聚合多实例输出,便于快速定位问题。
  • 监控与告警:结合 Prometheus(指标)与 Grafana(看板/告警),对错误率、响应时延等关键指标设置阈值告警。

0