finops-mcp-server
Version:
MCP server for FinOps Center cost optimization integration
1 lines • 2.44 kB
JavaScript
import*as winston from"winston";import{v4 as uuidv4}from"uuid";import{LogLevel}from"../types/config.js";const correlationStorage=new Map;export function generateCorrelationId(){return uuidv4()}export function setCorrelationId(e){correlationStorage.set("current",e)}export function getCorrelationId(){return correlationStorage.get("current")}export function clearCorrelationId(){correlationStorage.delete("current")}export function createLogger(e){const r=e.logLevel||LogLevel.INFO,t=winston.createLogger({level:r,format:winston.format.combine(winston.format.timestamp({format:"YYYY-MM-DD HH:mm:ss.SSS"}),winston.format.errors({stack:!0}),winston.format.printf(e=>{const r={timestamp:e.timestamp||(new Date).toISOString(),level:e.level,message:String(e.message)},t=getCorrelationId();(t||e.meta)&&(r.meta={...e.meta},t&&(r.meta.correlationId=t)),e.error&&(r.error={name:e.error.name,message:e.error.message},e.error.stack&&(r.error.stack=e.error.stack));const o=redactSensitiveData(r);return JSON.stringify(o,null,0)})),transports:[new winston.transports.Console({stderrLevels:["error","warn"],consoleWarnLevels:["warn"]})]}),o={debug:(e,r)=>{t.debug(e,{meta:enhanceMeta(r)})},info:(e,r)=>{t.info(e,{meta:enhanceMeta(r)})},warn:(e,r)=>{t.warn(e,{meta:enhanceMeta(r)})},error:(e,r,o)=>{t.error(e,{meta:enhanceMeta(o),error:r})},child:e=>createChildLogger(o,e)};return o}function enhanceMeta(e){const r=getCorrelationId(),t={timestamp:(new Date).toISOString(),...e};return r&&(t.correlationId=r),t}function createChildLogger(e,r){return{debug:(t,o)=>{e.debug(t,{...r,...o})},info:(t,o)=>{e.info(t,{...r,...o})},warn:(t,o)=>{e.warn(t,{...r,...o})},error:(t,o,n)=>{e.error(t,o,{...r,...n})},child:t=>createChildLogger(e,{...r,...t})}}function redactSensitiveData(e){if(!e||"object"!=typeof e)return e;const r=["api_key","apiKey","api-key","token","authorization","auth","password","secret","key","credentials","x-api-key"];return function e(t,o=""){if(!t||"object"!=typeof t)return t;if(Array.isArray(t))return t.map((r,t)=>e(r,`${o}[${t}]`));const n={};for(const[a,i]of Object.entries(t)){const t=o?`${o}.${a}`:a,s=a.toLowerCase();r.some(e=>s.includes(e))?"string"==typeof i&&i.length>0?n[a]=i.length>10?`${i.substring(0,6)}...[REDACTED]`:"[REDACTED]":n[a]="[REDACTED]":n[a]="object"==typeof i&&null!==i?e(i,t):i}return n}({...e})}export function createSilentLogger(){const e={debug:()=>{},info:()=>{},warn:()=>{},error:()=>{},child:()=>e};return e}