Logger

QuantaJS includes a comprehensive logging service that works across all JavaScript environments (Node.js, browser, and web workers). The logger provides configurable log levels, timestamps, prefixes, and color support.

Overview

The logger service is exported from @quantajs/core and provides:

  • Multiple log levels (DEBUG, INFO, WARN, ERROR, SILENT)
  • Environment detection (Node.js, browser, web worker)
  • Configurable formatting (timestamps, prefixes, colors)
  • Child loggers with prefixes
  • Safe console method execution

Exports

import { logger, Logger, LogLevel, createLogger } from '@quantajs/core';
  • logger: Default logger instance
  • Logger: Logger class for creating custom instances
  • LogLevel: Enum of available log levels
  • createLogger: Convenience function to create a logger with specific config

LogLevel Enum

enum LogLevel {
  DEBUG = 0,
  INFO = 1,
  WARN = 2,
  ERROR = 3,
  SILENT = 4,
}

Basic Usage

Using the Default Logger

import { logger } from '@quantajs/core';

// Log at different levels
logger.debug('Debug message');
logger.info('Info message');
logger.log('Log message'); // Alias for info
logger.warn('Warning message');
logger.error('Error message');

Setting Log Level

import { logger, LogLevel } from '@quantajs/core';

// Only show warnings and errors
logger.setLevel(LogLevel.WARN);

logger.debug('This won\'t be shown');
logger.info('This won\'t be shown');
logger.warn('This will be shown');
logger.error('This will be shown');

Configuring the Logger

import { logger } from '@quantajs/core';

logger.configure({
  level: LogLevel.DEBUG,
  prefix: 'MyApp',
  timestamp: true,
  colors: true, // Only in Node.js
});

Creating Custom Loggers

Using createLogger

import { createLogger, LogLevel } from '@quantajs/core';

const appLogger = createLogger({
  level: LogLevel.INFO,
  prefix: 'App',
  timestamp: true,
});

appLogger.info('Application started');
appLogger.error('Something went wrong');

Using the Logger Class

import { Logger, LogLevel } from '@quantajs/core';

const customLogger = new Logger({
  level: LogLevel.DEBUG,
  prefix: 'Custom',
  timestamp: true,
  colors: false,
});

customLogger.debug('Custom debug message');

Logger Configuration

LoggerConfig Interface

interface LoggerConfig {
  level: LogLevel;
  prefix?: string;
  timestamp?: boolean;
  colors?: boolean;
  formatters?: {
    [key: string]: (message: string, ...args: any[]) => string;
  };
}

Configuration Options

  • level: Minimum log level to display (default: LogLevel.INFO)
  • prefix: Optional prefix for all log messages
  • timestamp: Whether to include timestamps (default: true)
  • colors: Whether to use colors in Node.js (default: true, browser-safe)
  • formatters: Custom formatters for specific log levels

Child Loggers

Create child loggers with nested prefixes:

import { logger } from '@quantajs/core';

const storeLogger = logger.child('Store');
const userStoreLogger = storeLogger.child('User');

// Output: [INFO] [Store:User] User store initialized
userStoreLogger.info('User store initialized');

Environment Detection

The logger automatically detects the environment and adjusts behavior:

import { isNodeEnvironment, isBrowserEnvironment, isWebWorkerEnvironment } from '@quantajs/core';

if (isNodeEnvironment()) {
  console.log('Running in Node.js');
}

if (isBrowserEnvironment()) {
  console.log('Running in browser');
}

if (isWebWorkerEnvironment()) {
  console.log('Running in web worker');
}

Usage Examples

Store Logging

import { createStore, createLogger, LogLevel } from '@quantajs/core';

const storeLogger = createLogger({
  prefix: 'Store',
  level: LogLevel.DEBUG,
});

const userStore = createStore('user', {
  state: () => ({ user: null }),
  actions: {
    login(user) {
      storeLogger.debug('User login attempt', user);
      this.user = user;
      storeLogger.info('User logged in successfully');
    },
    logout() {
      storeLogger.info('User logged out');
      this.user = null;
    },
  },
});

Development vs Production

import { logger, LogLevel } from '@quantajs/core';

const isDevelopment = process.env.NODE_ENV === 'development';

logger.configure({
  level: isDevelopment ? LogLevel.DEBUG : LogLevel.WARN,
  timestamp: isDevelopment,
  colors: isDevelopment && typeof process !== 'undefined',
});

Error Tracking

import { logger } from '@quantajs/core';

try {
  // Some operation
  riskyOperation();
} catch (error) {
  logger.error('Operation failed', error);
  // Send to error tracking service
  errorTrackingService.captureException(error);
}

Conditional Logging

import { logger, LogLevel } from '@quantajs/core';

function performExpensiveOperation() {
  logger.debug('Starting expensive operation');
  
  // Only log in development
  if (logger.getLevel() <= LogLevel.DEBUG) {
    logger.debug('Operation details:', { /* large object */ });
  }
  
  // Perform operation
  const result = expensiveComputation();
  
  logger.info('Operation completed', result);
  return result;
}

Logger Methods

log / info

Standard logging at INFO level:

logger.log('Message');
logger.info('Message'); // Alias for log

debug

Debug-level logging (only shown when level is DEBUG):

logger.debug('Debug information');

warn

Warning-level logging:

logger.warn('Warning message');

error

Error-level logging:

logger.error('Error message');

configure

Update logger configuration:

logger.configure({
  level: LogLevel.WARN,
  prefix: 'NewPrefix',
});

setLevel

Set the minimum log level:

logger.setLevel(LogLevel.ERROR);

getLevel

Get the current log level:

const currentLevel = logger.getLevel();

child

Create a child logger with a prefix:

const childLogger = logger.child('Component');

Best Practices

Use Appropriate Log Levels

  • DEBUG: Detailed information for debugging
  • INFO: General informational messages
  • WARN: Warning messages for potential issues
  • ERROR: Error messages for failures

Use Prefixes for Context

const componentLogger = logger.child('UserComponent');
componentLogger.info('Component mounted');

Configure for Environment

logger.configure({
  level: process.env.NODE_ENV === 'production' 
    ? LogLevel.WARN 
    : LogLevel.DEBUG,
});

Avoid Logging Sensitive Data

// ❌ Bad
logger.info('User data:', { password: 'secret' });

// ✅ Good
logger.info('User logged in:', { userId: user.id });

Learn More