Skip to content

Logging

Meloqui provides structured logging with configurable log levels.

ILogger

Interface for structured logging implementations.

typescript
interface ILogger {
  debug(message: string, context?: Record<string, unknown>): void;
  info(message: string, context?: Record<string, unknown>): void;
  warn(message: string, context?: Record<string, unknown>): void;
  error(message: string, error?: Error, context?: Record<string, unknown>): void;
}

LogLevel

Log level hierarchy: debug < info < warn < error

typescript
type LogLevel = 'debug' | 'info' | 'warn' | 'error';

ConsoleLogger

Default logger implementation that outputs to the console.

typescript
import { ChatClient, ConsoleLogger } from 'meloqui';

const logger = new ConsoleLogger({ level: 'debug' });

const client = new ChatClient({
  provider: 'openai',
  model: 'gpt-4o',
  logger
});

ConsoleLoggerOptions

typescript
interface ConsoleLoggerOptions {
  /** Log level - only messages at this level or higher are logged */
  level?: LogLevel; // default: 'info'
}

Output Format

[DEBUG] Message here { context: 'data' }
[INFO] Message here { context: 'data' }
[WARN] Message here { context: 'data' }
[ERROR] Message here Error: ... { context: 'data' }

Custom Logger Implementation

Implement ILogger to integrate with your logging infrastructure:

typescript
import { ILogger } from 'meloqui';
import winston from 'winston';

class WinstonLogger implements ILogger {
  private logger: winston.Logger;

  constructor() {
    this.logger = winston.createLogger({
      level: 'debug',
      format: winston.format.json(),
      transports: [new winston.transports.Console()]
    });
  }

  debug(message: string, context?: Record<string, unknown>): void {
    this.logger.debug(message, context);
  }

  info(message: string, context?: Record<string, unknown>): void {
    this.logger.info(message, context);
  }

  warn(message: string, context?: Record<string, unknown>): void {
    this.logger.warn(message, context);
  }

  error(message: string, error?: Error, context?: Record<string, unknown>): void {
    this.logger.error(message, { error, ...context });
  }
}

With Pino

typescript
import { ILogger } from 'meloqui';
import pino from 'pino';

class PinoLogger implements ILogger {
  private logger = pino();

  debug(message: string, context?: Record<string, unknown>): void {
    this.logger.debug(context, message);
  }

  info(message: string, context?: Record<string, unknown>): void {
    this.logger.info(context, message);
  }

  warn(message: string, context?: Record<string, unknown>): void {
    this.logger.warn(context, message);
  }

  error(message: string, error?: Error, context?: Record<string, unknown>): void {
    this.logger.error({ err: error, ...context }, message);
  }
}

Silent Logger

To disable logging entirely:

typescript
const silentLogger: ILogger = {
  debug: () => {},
  info: () => {},
  warn: () => {},
  error: () => {}
};

const client = new ChatClient({
  provider: 'openai',
  model: 'gpt-4o',
  logger: silentLogger
});

Released under the MIT License.