@mastra/core
Version:
Mastra is a framework for building AI-powered applications and agents with a modern TypeScript stack.
1 lines • 16.4 kB
Source Map (JSON)
{"version":3,"sources":["../src/logger/multi-logger.ts","../src/logger/dual-logger.ts","../src/logger/noop-logger.ts","../src/logger/transport.ts"],"names":["resolveCurrentSpan","Transform"],"mappings":"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","file":"chunk-EWRRRV2O.cjs","sourcesContent":["import type { MastraError } from '../error';\nimport type { LogLevel } from './constants';\nimport type { IMastraLogger } from './logger';\nimport type { LoggerTransport } from './transport';\n\nexport class MultiLogger implements IMastraLogger {\n private loggers: IMastraLogger[];\n\n constructor(loggers: IMastraLogger[]) {\n this.loggers = loggers;\n }\n\n debug(message: string, ...args: any[]): void {\n this.loggers.forEach(logger => logger.debug(message, ...args));\n }\n\n info(message: string, ...args: any[]): void {\n this.loggers.forEach(logger => logger.info(message, ...args));\n }\n\n warn(message: string, ...args: any[]): void {\n this.loggers.forEach(logger => logger.warn(message, ...args));\n }\n\n error(message: string, ...args: any[]): void {\n this.loggers.forEach(logger => logger.error(message, ...args));\n }\n\n trackException(error: MastraError, metadata?: Record<string, unknown>): void {\n this.loggers.forEach(logger => logger.trackException(error, metadata));\n }\n\n getTransports(): Map<string, LoggerTransport> {\n const transports: [string, LoggerTransport][] = [];\n this.loggers.forEach(logger => transports.push(...logger.getTransports().entries()));\n return new Map(transports);\n }\n\n async listLogs(\n transportId: string,\n params?: {\n fromDate?: Date;\n toDate?: Date;\n logLevel?: LogLevel;\n filters?: Record<string, any>;\n returnPaginationResults?: boolean;\n page?: number;\n perPage?: number;\n },\n ) {\n for (const logger of this.loggers) {\n const logs = await logger.listLogs(transportId, params);\n if (logs.total > 0) {\n return logs;\n }\n }\n\n return { logs: [], total: 0, page: params?.page ?? 1, perPage: params?.perPage ?? 100, hasMore: false };\n }\n\n async listLogsByRunId(args: {\n transportId: string;\n runId: string;\n fromDate?: Date;\n toDate?: Date;\n logLevel?: LogLevel;\n filters?: Record<string, any>;\n page?: number;\n perPage?: number;\n }) {\n for (const logger of this.loggers) {\n const logs = await logger.listLogsByRunId(args);\n if (logs.total > 0) {\n return logs;\n }\n }\n\n return { logs: [], total: 0, page: args.page ?? 1, perPage: args.perPage ?? 100, hasMore: false };\n }\n}\n","import type { MastraError } from '../error';\nimport type { LoggerContext } from '../observability/types/logging';\nimport { resolveCurrentSpan } from '../observability/utils';\nimport type { LogLevel } from './constants';\nimport type { IMastraLogger } from './logger';\nimport type { BaseLogMessage, LoggerTransport } from './transport';\n\n/**\n * A transparent wrapper around IMastraLogger that also forwards log calls\n * to a LoggerContext (loggerVNext) for observability dual-write.\n *\n * All existing `this.logger.info(...)` call sites automatically get\n * dual-write when this wrapper is injected via `__setLogger()`.\n *\n * Span-aware: when called inside an executeWithContext() scope, forwards to\n * a span-correlated loggerVNext (with traceId/spanId). Otherwise falls back\n * to the global loggerVNext (no correlation, still persisted to storage).\n *\n * Uses a lazy getter function for loggerVNext so it always resolves the\n * current LoggerContext at call time (observability may initialize after the logger).\n */\nexport class DualLogger implements IMastraLogger {\n #inner: IMastraLogger;\n #getLoggerVNext: (() => LoggerContext | undefined) | undefined;\n\n constructor(inner: IMastraLogger, getLoggerVNext?: () => LoggerContext | undefined) {\n this.#inner = inner;\n this.#getLoggerVNext = getLoggerVNext;\n }\n\n /**\n * Set or update the loggerVNext getter.\n * Called after observability initializes (which may happen after logger creation).\n */\n setLoggerVNext(getLoggerVNext: (() => LoggerContext | undefined) | undefined): void {\n this.#getLoggerVNext = getLoggerVNext;\n }\n\n debug(message: string, ...args: any[]): void {\n this.#inner.debug(message, ...args);\n this.#forwardToVNext('debug', message, args);\n }\n\n info(message: string, ...args: any[]): void {\n this.#inner.info(message, ...args);\n this.#forwardToVNext('info', message, args);\n }\n\n warn(message: string, ...args: any[]): void {\n this.#inner.warn(message, ...args);\n this.#forwardToVNext('warn', message, args);\n }\n\n error(message: string, ...args: any[]): void {\n this.#inner.error(message, ...args);\n this.#forwardToVNext('error', message, args);\n }\n\n trackException(error: MastraError, metadata?: Record<string, unknown>): void {\n this.#inner.trackException(error, metadata);\n try {\n const loggerVNext = this.#resolveLoggerVNext();\n loggerVNext?.error(error.message, {\n errorId: error.id,\n domain: error.domain,\n category: error.category,\n details: error.details,\n cause: error.cause?.message,\n ...metadata,\n });\n } catch {\n // Never let loggerVNext errors break the primary logger\n }\n }\n\n getTransports(): Map<string, LoggerTransport> {\n return this.#inner.getTransports();\n }\n\n async listLogs(\n transportId: string,\n params?: {\n fromDate?: Date;\n toDate?: Date;\n logLevel?: LogLevel;\n filters?: Record<string, any>;\n page?: number;\n perPage?: number;\n },\n ): Promise<{ logs: BaseLogMessage[]; total: number; page: number; perPage: number; hasMore: boolean }> {\n return this.#inner.listLogs(transportId, params);\n }\n\n async listLogsByRunId(args: {\n transportId: string;\n runId: string;\n fromDate?: Date;\n toDate?: Date;\n logLevel?: LogLevel;\n filters?: Record<string, any>;\n page?: number;\n perPage?: number;\n }): Promise<{ logs: BaseLogMessage[]; total: number; page: number; perPage: number; hasMore: boolean }> {\n return this.#inner.listLogsByRunId(args);\n }\n\n /**\n * Resolve the best available LoggerContext:\n * 1. Span-correlated loggerVNext from AsyncLocalStorage (has traceId/spanId)\n * 2. Global loggerVNext from the lazy getter (no correlation, still persisted)\n */\n #resolveLoggerVNext(): LoggerContext | undefined {\n // Check for a span in async context (set by executeWithContext)\n const span = resolveCurrentSpan();\n if (span) {\n const correlated = span.observabilityInstance?.getLoggerContext?.(span);\n if (correlated) return correlated;\n }\n\n // Fall back to global loggerVNext (no trace correlation)\n return this.#getLoggerVNext?.();\n }\n\n /**\n * Adapt IMastraLogger's variadic args to LoggerContext's structured data param.\n * Extracts the first plain object as `data`, serializes Error args, and\n * collects any remaining primitives so the dual write preserves all context.\n */\n #forwardToVNext(level: 'debug' | 'info' | 'warn' | 'error', message: string, args: any[]): void {\n try {\n const loggerVNext = this.#resolveLoggerVNext();\n if (!loggerVNext) return;\n\n const objectData = args.find(\n (arg): arg is Record<string, unknown> =>\n arg !== null && typeof arg === 'object' && !Array.isArray(arg) && !(arg instanceof Error),\n );\n const errorArg = args.find((arg): arg is Error => arg instanceof Error);\n const extraArgs = args.filter(arg => arg !== objectData && arg !== errorArg);\n\n loggerVNext[level](message, {\n ...(objectData ?? {}),\n ...(errorArg\n ? {\n error: {\n name: errorArg.name,\n message: errorArg.message,\n stack: errorArg.stack,\n },\n }\n : {}),\n ...(extraArgs.length > 0 ? { args: extraArgs } : {}),\n });\n } catch {\n // Never let loggerVNext errors break the primary logger\n }\n }\n}\n","import type { IMastraLogger } from './logger';\n\nexport const noopLogger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n cleanup: async () => {},\n getTransports: () => new Map(),\n trackException: () => {},\n listLogs: async () => ({ logs: [], total: 0, page: 1, perPage: 100, hasMore: false }),\n listLogsByRunId: async () => ({ logs: [], total: 0, page: 1, perPage: 100, hasMore: false }),\n} as IMastraLogger;\n","import { Transform } from 'node:stream';\nimport type { LogLevel } from './constants';\n\nexport interface BaseLogMessage {\n runId?: string;\n msg: string;\n level: LogLevel;\n time: Date;\n pid: number;\n hostname: string;\n name: string;\n}\n\nexport abstract class LoggerTransport extends Transform {\n constructor(opts: any = {}) {\n super({ ...opts, objectMode: true });\n }\n\n async listLogsByRunId(_args: {\n runId: string;\n fromDate?: Date;\n toDate?: Date;\n logLevel?: LogLevel;\n filters?: Record<string, any>;\n page?: number;\n perPage?: number;\n }): Promise<{\n logs: BaseLogMessage[];\n total: number;\n page: number;\n perPage: number;\n hasMore: boolean;\n }> {\n return { logs: [], total: 0, page: _args?.page ?? 1, perPage: _args?.perPage ?? 100, hasMore: false };\n }\n async listLogs(_args?: {\n fromDate?: Date;\n toDate?: Date;\n logLevel?: LogLevel;\n filters?: Record<string, any>;\n returnPaginationResults?: boolean;\n page?: number;\n perPage?: number;\n }): Promise<{\n logs: BaseLogMessage[];\n total: number;\n page: number;\n perPage: number;\n hasMore: boolean;\n }> {\n return { logs: [], total: 0, page: _args?.page ?? 1, perPage: _args?.perPage ?? 100, hasMore: false };\n }\n}\n\nexport const createCustomTransport = (\n stream: Transform,\n listLogs?: LoggerTransport['listLogs'],\n listLogsByRunId?: LoggerTransport['listLogsByRunId'],\n) => {\n let transport = stream as LoggerTransport;\n if (listLogs) {\n transport.listLogs = listLogs;\n }\n if (listLogsByRunId) {\n transport.listLogsByRunId = listLogsByRunId;\n }\n return transport as LoggerTransport;\n};\n"]}