easy-config-logger
Version:
easy-config-logger is the logger with easy configuration. It is designed for both readability in development and json output in production.
125 lines (106 loc) • 2.92 kB
text/typescript
/**
* Logger
*/
import * as winston from 'winston';
import { transportConfig } from './config';
import { colors, envs, levels, prodEnvs } from './constants';
import { IMeta, IOption } from './interfaces';
/**
* Logger Class
*/
class Logger {
private baseMeta: IMeta;
private logger: winston.LoggerInstance;
/**
* @param options - logger options
* @param baseMeta - meta that always included
*/
constructor(options: IOption, baseMeta: IMeta = {}) {
this.baseMeta = baseMeta;
// validation
this.validateParams(options);
// create logger
this.logger = this.createWinstonLogger(options);
}
/**
* log with debug level
*
* @param message - log message
* @param meta - log metadata
*/
public debug(message: string, meta: IMeta = {}): void {
const metas: object = { ...this.baseMeta, ...meta };
this.logger.debug(message, metas);
}
/**
* log with info level
*
* @param message - log message
* @param meta - log metadata
*/
public info(message: string, meta: IMeta = {}): void {
const metas: object = { ...this.baseMeta, ...meta };
this.logger.info(message, metas);
}
/**
* log with warn level
*
* @param message - log message
* @param meta - log metadata
*/
public warn(message: string, meta: IMeta = {}): void {
const metas: object = { ...this.baseMeta, ...meta };
this.logger.warn(message, metas);
}
/**
* log with error level
*
* @param message - log message
* @param meta - log metadata
*/
public error(message: string, meta: IMeta = {}): void {
const metas: object = { ...this.baseMeta, ...meta };
this.logger.error(message, metas);
}
/**
* log with test level
*
* @param message - log message
* @param meta - log metadata
*/
public test(message: string, meta: IMeta = {}): void {
const metas: object = { ...this.baseMeta, ...meta };
this.logger.log('test', message, metas);
}
/**
* Validate Logger Params
*
* @param options - logger options
*/
private validateParams(options: IOption): void {
const { env, level } = options;
if (!Object.keys(levels).includes(level)) {
throw new Error(`Log Level '${level}' is not available`);
}
if (!envs.includes(env)) {
throw new Error(`Environment '${env}' is not available`);
}
}
/**
* create logger with winston
*
* @param options - logger options
*/
private createWinstonLogger(options: IOption): winston.LoggerInstance {
const { env, level } = options;
const transportConfiguration: winston.WinstonModuleTransportOptions = prodEnvs.includes(env) ?
transportConfig.prod : transportConfig.dev;
return new (winston.Logger)({
level,
levels,
colors,
transports: [new (winston.transports.Console)(transportConfiguration)]
});
}
}
export { Logger, IMeta, IOption };