You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EC2上Node.js应用日志流式传输至Sumo Logic的优化及log4js适配问询

优化日志传输至Sumo Logic的方案

一、优化单条日志发起HTTP请求的问题

当前每条日志单独发送HTTP请求的方式会产生额外网络开销,可通过以下方式优化:

  • 批量发送日志:将日志缓存至队列,达到指定数量或时间间隔时一次性批量发送,减少请求次数。示例实现:
    const https = require('https');
    const sumoURL = "https://xyz";
    let logQueue = [];
    const BATCH_SIZE = 10; // 攒够10条触发发送
    const FLUSH_INTERVAL = 5000; // 5秒强制刷新一次队列
    
    // 添加日志到队列
    function addLog(log) {
      logQueue.push({
        timestamp: new Date().toISOString(),
        ...log
      });
      if (logQueue.length >= BATCH_SIZE) {
        flushLogs();
      }
    }
    
    // 定时刷新队列
    setInterval(() => {
      if (logQueue.length > 0) flushLogs();
    }, FLUSH_INTERVAL);
    
    // 发送批量日志
    function flushLogs() {
      const logData = JSON.stringify(logQueue);
      const options = {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
          'Content-Length': logData.length,
          'Connection': 'keep-alive' // 复用TCP连接
        },
      };
    
      const req = https.request(sumoURL, options, (res) => res.resume()); // 忽略响应内容避免内存泄漏
    
      req.on('error', (error) => {
        console.error(`批量发送日志失败: ${error.message}`);
        // 可选:失败后将日志重新入队或持久化
      });
    
      req.write(logData);
      req.end();
      logQueue = [];
    }
    
    // 使用示例
    addLog({level: 'error', message: '示例错误日志1'});
    addLog({level: 'info', message: '示例信息日志1'});
    
  • 复用TCP连接:在请求头中设置Connection: keep-alive,避免每次请求都重新建立连接,降低握手开销。
  • 使用Sumo Logic官方客户端库:官方Node.js客户端已封装批量发送、连接复用等优化逻辑,无需自己实现底层细节。

二、使用log4js流式传输至Sumo Logic

完全可以通过log4js实现,推荐两种方案:

方式1:配置log4js原生HTTP Appender

利用log4js的HTTP Appender自带的批量配置,快速实现日志传输:

const log4js = require('log4js');

log4js.configure({
  appenders: {
    sumo: {
      type: 'http',
      url: 'https://xyz', // 你的Sumo Logic HTTP源地址
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Connection': 'keep-alive'
      },
      batchSize: 10, // 批量发送阈值
      timeout: 5000, // 超时时间
      layout: {
        type: 'pattern',
        pattern: '{"timestamp": "%d{ISO8601}", "level": "%p", "message": "%m"}'
      }
    }
  },
  categories: {
    default: { appenders: ['sumo'], level: 'all' }
  }
});

const logger = log4js.getLogger();
logger.error('这是一条error日志');
logger.info('这是一条info日志');

方式2:自定义log4js Appender结合Sumo客户端

如果需要更灵活的日志处理逻辑,可自定义Appender结合官方客户端:

const log4js = require('log4js');
const { createLogger } = require('@sumologic/nodejs-collector');

// 初始化Sumo Logic客户端
const sumoLogger = createLogger({
  endpoint: 'https://xyz',
  batchSize: 10,
  interval: 5000
});

// 自定义log4js Appender
log4js.addAppender((loggingEvent) => {
  const log = {
    timestamp: loggingEvent.startTime.toISOString(),
    level: loggingEvent.level.levelStr,
    message: loggingEvent.data.join(' ')
  };
  sumoLogger.log(log);
}, 'sumo-custom');

log4js.configure({
  categories: {
    default: { appenders: ['sumo-custom'], level: 'all' }
  }
});

const logger = log4js.getLogger();
logger.error('自定义Appender的error日志');

内容的提问来源于stack exchange,提问作者Subburaj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 10:52:15