{"version":3,"sources":["../src/logging.ts"],"sourcesContent":["/**\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { context } from '@opentelemetry/api';\nimport { logs, SeverityNumber } from '@opentelemetry/api-logs';\n\nconst LOG_LEVELS = ['debug', 'info', 'warn', 'error'];\n\nconst loggerKey = '__genkit_logger';\n\nconst _defaultLogger = {\n  shouldLog(targetLevel: string) {\n    return LOG_LEVELS.indexOf(this.level) <= LOG_LEVELS.indexOf(targetLevel);\n  },\n  debug(...args: any) {\n    this.shouldLog('debug') && console.debug(...args);\n  },\n  info(...args: any) {\n    this.shouldLog('info') && console.info(...args);\n  },\n  warn(...args: any) {\n    this.shouldLog('warn') && console.warn(...args);\n  },\n  error(...args: any) {\n    this.shouldLog('error') && console.error(...args);\n  },\n  level: 'info',\n};\n\nfunction getLogger() {\n  if (!global[loggerKey]) {\n    global[loggerKey] = _defaultLogger;\n  }\n  return global[loggerKey];\n}\n\nclass Logger {\n  readonly defaultLogger = _defaultLogger;\n\n  private _emitOtel(\n    level: string,\n    args: any[],\n    explicitBody?: string,\n    explicitAttributes?: Record<string, any>\n  ) {\n    if (process.env.GENKIT_OTEL_ENABLE_LOGS !== 'true') {\n      return;\n    }\n\n    try {\n      const currentLevel = getLogger().level || 'info';\n      if (LOG_LEVELS.indexOf(currentLevel) > LOG_LEVELS.indexOf(level)) {\n        return;\n      }\n\n      const otelLogger = logs.getLogger('genkit-logger');\n      let severityNumber: SeverityNumber;\n      switch (level) {\n        case 'debug':\n          severityNumber = SeverityNumber.DEBUG;\n          break;\n        case 'info':\n          severityNumber = SeverityNumber.INFO;\n          break;\n        case 'warn':\n          severityNumber = SeverityNumber.WARN;\n          break;\n        case 'error':\n          severityNumber = SeverityNumber.ERROR;\n          break;\n        default:\n          severityNumber = SeverityNumber.UNSPECIFIED;\n          break;\n      }\n\n      let body;\n      const attributes: Record<string, any> = explicitAttributes || {};\n      if (explicitBody !== undefined) {\n        body = explicitBody;\n      } else if (args.length === 1 && typeof args[0] === 'string') {\n        body = args[0];\n      } else {\n        const util = require('util');\n        body = util.format(...args);\n      }\n\n      let activeContext;\n      try {\n        activeContext = context.active();\n      } catch (e) {\n        // No-op if @opentelemetry/api trace is uninitialized or missing right now\n      }\n\n      otelLogger.emit({\n        severityNumber,\n        severityText: level.toUpperCase(),\n        body,\n        attributes,\n        ...(activeContext ? { context: activeContext } : {}),\n      });\n    } catch (err) {\n      // safe ignore\n    }\n  }\n\n  init(fn: any) {\n    global[loggerKey] = fn;\n  }\n\n  info(...args: any) {\n    // eslint-disable-next-line prefer-spread\n    getLogger().info.apply(getLogger(), args);\n    this._emitOtel('info', args);\n  }\n  debug(...args: any) {\n    // eslint-disable-next-line prefer-spread\n    getLogger().debug.apply(getLogger(), args);\n    this._emitOtel('debug', args);\n  }\n  error(...args: any) {\n    // eslint-disable-next-line prefer-spread\n    getLogger().error.apply(getLogger(), args);\n    this._emitOtel('error', args);\n  }\n  warn(...args: any) {\n    // eslint-disable-next-line prefer-spread\n    getLogger().warn.apply(getLogger(), args);\n    this._emitOtel('warn', args);\n  }\n\n  setLogLevel(level: 'error' | 'warn' | 'info' | 'debug') {\n    getLogger().level = level;\n  }\n\n  logStructured(msg: string, metadata: any) {\n    getLogger().info(msg, metadata);\n    this._emitOtel('info', [], msg, metadata);\n  }\n\n  logStructuredError(msg: string, metadata: any) {\n    getLogger().error(msg, metadata);\n    this._emitOtel('error', [], msg, metadata);\n  }\n}\n\n/**\n * Genkit logger.\n *\n * ```ts\n * import { logger } from 'genkit/logging';\n *\n * logger.setLogLevel('debug');\n * ```\n */\nexport const logger = new Logger();\n"],"mappings":"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","names":[]}