UNPKG

@mastra/core

Version:
1 lines 12.8 kB
{"version":3,"file":"index.cjs","names":["#inner","#getLoggerVNext","#forwardToVNext","#resolveLoggerVNext","resolveCurrentSpan","ConsoleLogger"],"sources":["../../src/logger/multi-logger.ts","../../src/logger/dual-logger.ts","../../src/logger/noop-logger.ts","../../src/logger/default-logger.ts"],"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 * The wrapped underlying logger, without the observability dual-write layer.\n * Use this when forwarding a logger to observability to avoid recursing back\n * through the dual-write path.\n */\n get baseLogger(): IMastraLogger {\n return this.#inner;\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 { ConsoleLogger } from '@internal/core/logger';\nimport type { LogLevel, LoggerTransport } from '@internal/core/logger';\n\nexport const createLogger = (options: {\n name?: string;\n level?: LogLevel;\n transports?: Record<string, LoggerTransport>;\n}) => {\n const logger = new ConsoleLogger(options);\n\n logger.warn('createLogger is deprecated. Please use \"new ConsoleLogger()\" from \"@mastra/core/logger\" instead.');\n\n return logger;\n};\n\nexport { ConsoleLogger, type ConsoleLoggerOptions, type LogFilter, type LogFilterContext } from '@internal/core/logger';\n"],"mappings":"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"}