Javascript SDK Logging
Provides a centralized LogManager and errorHandler for Javascript SDK packages.
Installation
npm install @opendoor/optimizely-js-sdk-logging
Architecture
- LogHandler - the component that determines where to write logs. Common log handlers
are
ConsoleLogHandler
or NoopLogHandler
- LogManager - returns Logger facade instances via LogManager.getLogger(name)
- LoggerFacade the internal logging interface available to other packages via
LogManager.getLogger(name)
Usage
Using the logger
import { getLogger } from '@opendoor/optimizely-js-sdk-logging'
const logger = getLogger('myModule')
logger.log('warn', 'this is a warning')
logger.debug('string interpolation is easy and %s', 'lazily evaluated')
logger.info('info logging')
logger.warn('this is a warning')
logger.error('this is an error')
logger.error('an error occurred: %s', ex.message)
logger.error('an error occurred: %s', ex.message, ex)
logger.error(ex)
Setting the log level
import { LogLevel, setLogLevel } from '@opendoor/optimizely-js-sdk-logging'
setLogLevel(LogLevel.ERROR)
setLogLevel('debug')
setLogLevel('info')
setLogLevel('warn')
setLogLevel('error')
Setting a LogHandler
import { setLogHandler, ConsoleLogHandler } from '@opendoor/optimizely-js-sdk-logging'
const handler = new ConsoleLogHandler({
logLevel: 'error',
prefix: '[My custom prefix]',
})
setLogHandler(handler)
Implementing a custom LogHandler
Perhaps you want to integrate Optimizely with your own logging system or use an existing library.
A valid LogHandler
is anything that implements this interface
interface LogHandler {
log(level: LogLevel, message: string): void
}
Example: integrating with Winston
import winston from 'winston'
import { setLogHandler, LogLevel } from '@opendoor/optimizely-js-sdk-logging'
const winstonLogger = winston.createLogger({
level: 'info',
format: winston.format.json(),
defaultMeta: { service: 'optimizely' },
transports: [
new winston.transports.File({ filename: 'combined.log' }),
],
})
function convertLogLevels(level) {
switch(level) {
case LogLevel.DEBUG:
return 'debug'
case LogLevel.INFO:
return 'info'
case LogLevel.WARNING:
return 'warning'
case LogLevel.ERROR:
return 'error'
default:
return 'silly'
}
}
setLogHandler({
log(level, message) {
winstoLogger.log({
level: convertLogLevels(level),
message,
})
}
})
API Interfaces
interface LoggerFacade {
log(level: LogLevel | string, message: string): void
info(message: string | Error, ...splat: any[]): void
debug(message: string | Error, ...splat: any[]): void
warn(message: string | Error, ...splat: any[]): void
error(message: string | Error, ...splat: any[]): void
}
interface LogManager {
getLogger(name?: string): LoggerFacade
}
interface LogHandler {
log(level: LogLevel, message: string): void
}