插件窝 干货文章 Node.js日志格式选择建议

Node.js日志格式选择建议

format 日志 transports javascript 845    来源:    2025-05-04

在Node.js中选择合适的日志格式需要综合考虑可读性、结构化需求、分析工具兼容性以及性能等因素。以下是针对不同场景的详细建议:

一、常见日志格式对比

格式类型 优点 缺点 适用场景
纯文本 人类可读,简单直接 难以机器解析 开发环境/简单应用
JSON 结构化,易解析 体积稍大 生产环境/ELK等日志系统
CSV 表格兼容 嵌套数据表现力差 报表系统
Syslog 标准化,支持网络传输 配置复杂 企业级系统
GELF 二进制高效,支持压缩 需要专用解析器 Graylog等专用日志收集器

二、推荐方案组合

  1. 开发环境

    // 使用winston的简单格式
    const { createLogger, format, transports } = require('winston');
    const logger = createLogger({
     format: format.combine(
       format.colorize(),
       format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
       format.printf(info => `${info.timestamp} [${info.level}] ${info.message}`)
     ),
     transports: [new transports.Console()]
    });
    
  2. 生产环境

    // 结构化JSON日志
    const logger = createLogger({
     format: format.combine(
       format.timestamp(),
       format.json({
         space: 2, // 开发时可读性优化
         replacer: (key, value) => {
           if (value instanceof Error) {
             return {
               message: value.message,
               stack: value.stack,
               ...value
             };
           }
           return value;
         }
       })
     ),
     transports: [
       new transports.File({ filename: 'app.log' }),
       new transports.Console() // 保持控制台输出
     ]
    });
    

三、高级配置建议

  1. 错误处理增强

    logger.on('error', (err) => {
     console.error('Logger failed:', err);
     // 可添加fallback处理(如发送到Sentry)
    });
    
  2. 日志切割

    # 使用logrotate(Linux系统)
    /var/log/node-app/*.log {
     daily
     rotate 7
     compress
     missingok
     notifempty
    }
    
  3. 性能敏感场景

    // 使用pino(性能比winston高约5倍)
    const pino = require('pino');
    const logger = pino({
     level: 'info',
     formatters: {
       level: (label) => ({ level: label.toUpperCase() })
     },
     transport: {
       target: 'pino-pretty',
       options: { colorize: true }
     }
    });
    

四、字段规范建议

建议包含以下核心字段:

{
  "timestamp": "ISO8601格式",
  "level": "INFO/WARN/ERROR等",
  "service": "服务名称",
  "requestId": "请求追踪ID",
  "userId": "可选用户标识",
  "durationMs": 123,
  "error": {
    "message": "",
    "stack": "",
    "code": ""
  }
}

五、安全注意事项

  1. 避免记录:

    • 完整信用卡号等PCI数据
    • 明文密码/API密钥
    • 完整JWT tokens
    • GDPR规定的个人隐私数据
  2. 敏感信息处理:

    format.redact({
     paths: ['password', 'creditCard', '*.token'],
     censor: '**REDACTED**'
    })
    

六、日志级别使用规范

级别 使用场景
FATAL 导致服务完全不可用的错误(如数据库连接永久丢失)
ERROR 需要立即处理但不影响系统运行的错误(如API验证失败)
WARN 异常情况但可自动恢复(如重试操作成功)
INFO 关键业务流程节点(如用户注册成功)
DEBUG 调试信息(如SQL查询语句)
TRACE 详细跟踪信息(如函数调用参数)

根据实际需求选择合适的日志库组合(如winston+pino),并确保与现有监控系统(如Prometheus+Grafana)集成。在Kubernetes环境中建议使用Fluentd+ELK方案收集日志。