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 instanceLogger: Logger class for creating custom instancesLogLevel: Enum of available log levelscreateLogger: 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 messagestimestamp: 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
- Core Concepts - Understanding QuantaJS
- API Reference - Complete API documentation