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
相关产品推荐
相关产品推荐

