温馨提示×

如何配置Debian JS日志

小樊
34
2025-12-12 10:26:06
栏目: 编程语言

Debian 上配置 JS 日志的实用方案

一 选择日志库与输出目标

  • 常用日志库:
    • Winston:多传输、可结构化输出,适合复杂场景。
    • Pino:高性能、低开销,生产环境优选。
    • MorganExpress 的 HTTP 请求日志中间件。
  • 基本输出目标:
    • Console(开发/调试)
    • 文件(按级别拆分,如 error/combined)
    • 可选:HTTP、流等(Winston 支持多传输)
  • 示例(Winston 最小可用配置):
    • 安装:npm install winston
    • 配置:
      • 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(‘Hello, world!’); logger.error(‘Oops!’);
  • 示例(Pino 控制台美化):
    • 安装:npm install pino pino-pretty
    • 配置:
      • const pino = require(‘pino’);
      • const logger = pino({ level: ‘info’, transport: { target: ‘pino-pretty’, options: { colorize: true } } });
      • logger.info(‘Hello, world!’); logger.error(‘Oops!’);

二 自定义日志格式与 HTTP 访问日志

  • 自定义格式(Winston 时间戳 + printf):
    • const { format } = require(‘winston’);
    • const logger = winston.createLogger({ level: ‘info’, format: format.combine( format.timestamp({ format: ‘YYYY-MM-DD HH:mm:ss’ }), format.printf(({ timestamp, level, message }) => { return ${timestamp} [${level.toUpperCase()}]: ${message}; }) ), transports: [new winston.transports.Console()] });
  • Express + Morgan(HTTP 请求日志):
    • 安装:npm install morgan
    • 配置:
      • const express = require(‘express’); const morgan = require(‘morgan’);
      • const app = express();
      • app.use(morgan(‘combined’)); // 或自定义 ‘:method :url :status :res[content-length] - :response-time ms’
      • app.listen(3000);
  • 反向代理日志格式(Nginx 示例):
    • http { log_format custom ‘$remote_addr - $remote_user [$time_local] “$request” $status $body_bytes_sent “$http_referer” “$http_user_agent” “$http_x_forwarded_for”’; access_log /var/log/nginx/access.log custom; error_log /var/log/nginx/error.log; … }
    • 如需调整代理层日志级别,可在 Nginx 中设置:log_level info;(注意这是 Nginx 自身日志级别,非应用日志级别)。

三 日志轮转与系统级管理

  • 应用内轮转(Winston + Daily Rotate File):
    • 安装:npm install winston-daily-rotate-file
    • 配置:
      • const DailyRotateFile = require(‘winston-daily-rotate-file’);
      • const transport = new DailyRotateFile({ filename: ‘application-%DATE%.log’, datePattern: ‘YYYY-MM-DD-HH’, zippedArchive: true, maxSize: ‘20m’, maxFiles: ‘14d’ });
      • const logger = winston.createLogger({ level: ‘info’, transports: [transport, new winston.transports.Console()] });
  • 系统级轮转(logrotate,适用于 Node 直接写文件或 PM2 输出文件):
    • 新建配置:sudo nano /etc/logrotate.d/nodejs
    • 示例:
      • /path/to/your/nodejs/logs/*.log { daily rotate 7 compress missingok notifempty create 0644 root root }
    • 校验与强制执行:
      • sudo logrotate -d /etc/logrotate.d/nodejs(干跑)
      • sudo logrotate -f /etc/logrotate.d/nodejs(强制执行)
  • 进程管理(PM2 内置日志与轮转):
    • 安装:sudo npm install -g pm2
    • 启动:pm2 start app.js --name my-app
    • 查看:pm2 logs
    • 分别输出错误与标准输出:pm2 start app.js --name my-app --error err.log --output out.log
    • 日志轮转(PM2 内置策略):pm2 set pm2-logrotate:max_size 10Mpm2 set pm2-logrotate:retain 14

四 环境变量与运行时控制

  • 通过环境变量控制日志级别与输出:
    • const logLevel = process.env.LOG_LEVEL || ‘info’;
    • const logger = winston.createLogger({ level: logLevel, format: winston.format.json(), transports: [new winston.transports.Console(), new winston.transports.File({ filename: ‘error.log’, level: ‘error’ }), new winston.transports.File({ filename: ‘combined.log’ })] });
  • Docker 场景(docker-compose.yml 片段):
    • services:
      • app:
        • build: .
        • environment:
          • NODE_ENV=production
          • LOG_LEVEL=debug
        • logging:
          • driver: “json-file”
          • options:
            • max-size: “10m”
            • max-file: “3”

五 集中式日志与监控

  • 使用 ELK Stack(Elasticsearch + Logstash + Kibana)集中收集与分析:
    • 安装并启动 Elasticsearch、Logstash、Kibana(示例为 7.x 源安装与 systemd 启动)。
    • Logstash 收集 Node.js 日志(/etc/logstash/conf.d/nodejs.conf 示例):
      • input { file { path => “/path/to/your/nodejs/logs/*.log” start_position => “beginning” } }
      • filter { }
      • output { elasticsearch { hosts => [“localhost:9200”] index => “nodejs-logs-%{+YYYY.MM.dd}” } }
    • 重启 Logstash:sudo systemctl restart logstash
    • Kibana 创建索引模式(如 nodejs-logs-*)并在 Discover 中查看分析。

0