amazon-seller-mcp
Version:
Model Context Protocol (MCP) client for Amazon Selling Partner API
283 lines • 7.71 kB
JavaScript
/**
* Logging system for Amazon Seller MCP Client
*
* This file contains the logging system implementation, including:
* - Configurable logging levels
* - Sensitive data redaction
* - Log formatting
*/
// Third-party dependencies
import winston from 'winston';
/**
* Log levels
*/
export var LogLevel;
(function (LogLevel) {
LogLevel["ERROR"] = "error";
LogLevel["WARN"] = "warn";
LogLevel["INFO"] = "info";
LogLevel["HTTP"] = "http";
LogLevel["DEBUG"] = "debug";
})(LogLevel || (LogLevel = {}));
/**
* Default redaction patterns for sensitive data
*/
const DEFAULT_REDACTION_PATTERNS = {
// Authentication related
accessToken: /(?<=accessToken["']?\s*[:=]\s*["']?)[\w-.]+(?=["']?)/gi,
refreshToken: /(?<=refreshToken["']?\s*[:=]\s*["']?)[\w-.]+(?=["']?)/gi,
clientSecret: /(?<=clientSecret["']?\s*[:=]\s*["']?)[\w-.]+(?=["']?)/gi,
secretAccessKey: /(?<=secretAccessKey["']?\s*[:=]\s*["']?)[\w-.]+(?=["']?)/gi,
// Credit card related
creditCard: /\b(?:\d{4}[ -]?){3}\d{4}\b/g,
// Personal information
email: /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/g,
phone: /\b(?:\+\d{1,2}\s?)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}\b/g,
// Amazon specific
sellerAuthToken: /(?<=sellerAuthToken["']?\s*[:=]\s*["']?)[\w-.]+(?=["']?)/gi,
};
/**
* Redact sensitive data from log messages
*
* @param message Log message
* @param patterns Redaction patterns
* @returns Redacted message
*/
export function redactSensitiveData(message, patterns = DEFAULT_REDACTION_PATTERNS) {
let redactedMessage = message;
// Apply each redaction pattern
Object.entries(patterns).forEach(([key, pattern]) => {
redactedMessage = redactedMessage.replace(pattern, `[REDACTED_${key.toUpperCase()}]`);
});
return redactedMessage;
}
/**
* Create a Winston logger instance
*
* @param config Logger configuration
* @returns Winston logger instance
*/
export function createLogger(config = {}) {
const { level = LogLevel.INFO, console = true, filePath, redactSensitiveData: shouldRedact = true, redactionPatterns = DEFAULT_REDACTION_PATTERNS, formatter, } = config;
// Create transports
const transports = [];
// Add console transport if enabled
if (console) {
transports.push(new winston.transports.Console({
format: winston.format.combine(winston.format.colorize(), winston.format.timestamp(), winston.format.printf(({ timestamp, level, message, ...meta }) => {
// Redact sensitive data if enabled
const finalMessage = shouldRedact
? redactSensitiveData(String(message), redactionPatterns)
: message;
// Format metadata
const metaString = Object.keys(meta).length ? `\n${JSON.stringify(meta, null, 2)}` : '';
return `${timestamp} [${level}]: ${finalMessage}${metaString}`;
})),
}));
}
// Add file transport if file path is provided
if (filePath) {
transports.push(new winston.transports.File({
filename: filePath,
format: winston.format.combine(winston.format.timestamp(), winston.format.json()),
}));
}
// Create logger
const logger = winston.createLogger({
level,
levels: winston.config.npm.levels,
format: formatter || winston.format.combine(winston.format.timestamp(), winston.format.json()),
transports,
});
return logger;
}
/**
* Default logger instance
*/
let defaultLogger;
/**
* Configure the default logger
*
* @param config Logger configuration
*/
export function configureLogger(config) {
defaultLogger = createLogger(config);
}
/**
* Initialize default logger if not already initialized
*/
function ensureDefaultLogger() {
if (!defaultLogger) {
defaultLogger = createLogger();
}
}
/**
* Get the default logger instance
*
* @returns Default logger instance
*/
export function getLogger() {
ensureDefaultLogger();
return defaultLogger;
}
/**
* Log an error message
*
* @param message Error message
* @param meta Additional metadata
*/
export function error(message, meta = {}) {
ensureDefaultLogger();
defaultLogger.error(message, meta);
}
/**
* Log a warning message
*
* @param message Warning message
* @param meta Additional metadata
*/
export function warn(message, meta = {}) {
ensureDefaultLogger();
defaultLogger.warn(message, meta);
}
/**
* Log an info message
*
* @param message Info message
* @param meta Additional metadata
*/
export function info(message, meta = {}) {
ensureDefaultLogger();
defaultLogger.info(message, meta);
}
/**
* Log an HTTP message
*
* @param message HTTP message
* @param meta Additional metadata
*/
export function http(message, meta = {}) {
ensureDefaultLogger();
defaultLogger.http(message, meta);
}
/**
* Log a debug message
*
* @param message Debug message
* @param meta Additional metadata
*/
export function debug(message, meta = {}) {
ensureDefaultLogger();
defaultLogger.debug(message, meta);
}
/**
* Create a child logger with additional metadata
*
* @param meta Default metadata to include with all log messages
* @returns Child logger
*/
export function createChildLogger(meta) {
ensureDefaultLogger();
return defaultLogger.child(meta);
}
/**
* Create a request logger middleware for HTTP requests
*
* @returns Request logger middleware
*/
export function createRequestLogger() {
return (req, res, next) => {
const start = Date.now();
// Log request
http(`${req.method} ${req.url}`, {
method: req.method,
url: req.url,
ip: req.ip,
userAgent: Array.isArray(req.headers['user-agent'])
? req.headers['user-agent'][0]
: req.headers['user-agent'],
});
// Log response when finished
res.on('finish', () => {
const duration = Date.now() - start;
http(`${req.method} ${req.url} ${res.statusCode} ${duration}ms`, {
method: req.method,
url: req.url,
statusCode: res.statusCode,
duration,
});
});
next();
};
}
/**
* Logger class wrapper for easier instantiation and testing
*/
export class Logger {
logger;
/**
* Create a new Logger instance
* @param config Logger configuration
*/
constructor(config = {}) {
this.logger = createLogger(config);
}
/**
* Log an error message
*/
error(message, meta = {}) {
this.logger.error(message, meta);
}
/**
* Log a warning message
*/
warn(message, meta = {}) {
this.logger.warn(message, meta);
}
/**
* Log an info message
*/
info(message, meta = {}) {
this.logger.info(message, meta);
}
/**
* Log an HTTP message
*/
http(message, meta = {}) {
this.logger.http(message, meta);
}
/**
* Log a debug message
*/
debug(message, meta = {}) {
this.logger.debug(message, meta);
}
/**
* Create a child logger with additional metadata
*/
createChild(meta) {
return this.logger.child(meta);
}
/**
* Get the underlying winston logger
*/
getWinstonLogger() {
return this.logger;
}
}
export default {
LogLevel,
Logger,
configureLogger,
getLogger,
createLogger,
error,
warn,
info,
http,
debug,
createChildLogger,
createRequestLogger,
redactSensitiveData,
};
//# sourceMappingURL=logger.js.map