otel-logger.ts 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import { logs, SeverityNumber } from '@opentelemetry/api-logs';
  2. import { DefaultLogger, LogLevel, VENDURE_VERSION, VendureLogger } from '@vendure/core';
  3. export const otelLogger = logs.getLogger('@vendure/core', VENDURE_VERSION);
  4. /**
  5. * @description
  6. * Options for the OtelLogger.
  7. *
  8. * @since 3.3.0
  9. * @docsCategory core plugins/TelemetryPlugin
  10. * @docsPage OtelLogger
  11. */
  12. export interface OtelLoggerOptions {
  13. /**
  14. * @description
  15. * If set to a LogLevel, the logger will also log to the console.
  16. * This can be useful for local development or debugging.
  17. *
  18. * @example
  19. * ```ts
  20. * import { LogLevel } from '@vendure/core';
  21. * import { TelemetryPlugin } from '@vendure/telemetry-plugin';
  22. *
  23. * // ...
  24. *
  25. * TelemetryPlugin.init({
  26. * loggerOptions: {
  27. * logToConsole: LogLevel.Verbose,
  28. * },
  29. * });
  30. * ```
  31. */
  32. logToConsole?: LogLevel;
  33. }
  34. /**
  35. * @description
  36. * A logger that emits logs to OpenTelemetry and optionally to the console.
  37. *
  38. * @since 3.3.0
  39. * @docsCategory core plugins/TelemetryPlugin
  40. * @docsPage OtelLogger
  41. * @docsWeight 0
  42. */
  43. export class OtelLogger implements VendureLogger {
  44. private defaultLogger?: DefaultLogger;
  45. constructor(options: OtelLoggerOptions) {
  46. if (options.logToConsole) {
  47. this.defaultLogger = new DefaultLogger({
  48. level: options.logToConsole,
  49. timestamp: false,
  50. });
  51. }
  52. }
  53. debug(message: string, context?: string): void {
  54. this.emitLog(SeverityNumber.DEBUG, message, context);
  55. this.defaultLogger?.debug(message, context);
  56. }
  57. warn(message: string, context?: string): void {
  58. this.emitLog(SeverityNumber.WARN, message, context);
  59. this.defaultLogger?.warn(message, context);
  60. }
  61. info(message: string, context?: string): void {
  62. this.emitLog(SeverityNumber.INFO, message, context);
  63. this.defaultLogger?.info(message, context);
  64. }
  65. error(message: string, context?: string): void {
  66. this.emitLog(SeverityNumber.ERROR, message, context);
  67. this.defaultLogger?.error(message, context);
  68. }
  69. verbose(message: string, context?: string): void {
  70. this.emitLog(SeverityNumber.DEBUG, message, context);
  71. this.defaultLogger?.verbose(message, context);
  72. }
  73. private emitLog(severityNumber: SeverityNumber, message: string, context?: string, label?: string): void {
  74. otelLogger.emit({
  75. severityNumber,
  76. body: message,
  77. attributes: {
  78. context,
  79. service_name: 'vendure',
  80. ...(label ? { label } : {}),
  81. },
  82. });
  83. }
  84. }