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

sap-cloud-sdk-logger是否支持输出Correlation ID及自定义传递方法咨询

关于sap-cloud-sdk-logger输出Correlation ID的问题解答

核心结论

默认情况下,@sap-cloud-sdk/util提供的sap-cloud-sdk-logger不会自动输出Correlation ID,官方文档目前确实未明确覆盖该场景。

手动添加Correlation ID的几种方案

方案1:自定义全局日志格式化函数

通过重写logger的格式化逻辑,让所有日志自动带上Correlation ID,适合需要全量日志都包含该字段的场景:

const { logger } = require('@sap-cloud-sdk/util');

// 替换为你的Correlation ID获取逻辑(比如从请求上下文、环境变量)
const getCurrentCorrelationId = () => {
  // 示例:从Express请求头获取,或从AsyncLocalStorage中读取
  return process.env.REQ_CORRELATION_ID || 'unset';
};

// 自定义格式化函数,输出带correlation_id的JSON结构(适配Kibana字段)
logger.setFormatter((level, message, meta) => {
  const correlationId = getCurrentCorrelationId();
  return JSON.stringify({
    level,
    message,
    correlation_id: correlationId,
    ...meta // 保留原有元数据
  });
});

方案2:日志调用时手动传入元数据

如果只需要部分日志携带Correlation ID,可以在每次调用日志方法时,将ID作为元数据参数传入:

// 从上下文获取实际的Correlation ID
const correlationId = 'xxx-xxx-xxx';

// 日志调用时附加correlation_id字段
logger.info('订单创建成功', { correlation_id: correlationId });
logger.error('支付失败', { correlation_id: correlationId, error: err.stack });

方案3:结合AsyncLocalStorage实现全链路自动注入(Node.js环境)

对于Node.js后端应用,可通过AsyncLocalStorage存储请求级别的Correlation ID,实现全链路日志自动携带,无需手动传递:

const { AsyncLocalStorage } = require('async_hooks');
const { logger } = require('@sap-cloud-sdk/util');
const express = require('express');
const app = express();

const asyncLocalStorage = new AsyncLocalStorage();

// 生成随机Correlation ID的工具函数
const generateCorrelationId = () => Math.random().toString(36).substring(2, 15);

// Express中间件:从请求头获取或生成Correlation ID,存入AsyncLocalStorage
app.use((req, res, next) => {
  const correlationId = req.headers['x-correlation-id'] || generateCorrelationId();
  asyncLocalStorage.run(new Map(), () => {
    asyncLocalStorage.getStore().set('correlationId', correlationId);
    next();
  });
});

// 自定义日志格式化,自动从AsyncLocalStorage读取ID
logger.setFormatter((level, message, meta) => {
  const correlationId = asyncLocalStorage.getStore()?.get('correlationId') || 'unknown';
  return JSON.stringify({
    level,
    message,
    correlation_id: correlationId,
    ...meta
  });
});

// 业务路由中直接打日志,自动携带Correlation ID
app.get('/api/orders', (req, res) => {
  logger.info('查询订单列表'); // 日志自动包含当前请求的correlation_id
  res.send({ orders: [] });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 00:17:40