rest-api-starter
Version:
Rest API starter kit.
129 lines (110 loc) • 3.54 kB
JavaScript
/**
* Created by svinci on 11/27/16.
*/
;
const configuration = require('config');
const winston = require('winston');
/**
* Transaction store.
*/
const localStore = require('./local-store');
/**
* Retrieve current transaction's id.
*/
const getTransactionId = () => localStore.getValue('tid', '-');
/**
* Log levels priority definitions.
* @type {{debug: number, info: number, warn: number, warning: number, error: number, off: number}}
*/
const logLevelWeights = {
'debug': 1,
'info': 2,
'warn': 3,
'warning': 3,
'error': 4,
'off': 5
};
/**
* Message formatter function.
* @param options
* @returns {string}
*/
const formatter = (options) => {
const message = options.message ? options.message : '';
return `${options.timestamp()} [${options.level.toUpperCase()}] - [tid: ${getTransactionId()}] - ${message}`;
};
/**
* File transport builder.
* @param transport
*/
const getFileTransport = (transport) => new winston.transports.File({
'name': 'file-transport',
'handleExceptions': false,
'json': false,
'level': configuration.get('app.log.level'),
'filename': transport.filename,
'timestamp': () => new Date().toISOString(),
'formatter': formatter
});
/**
* Console transport builder.
*/
const getConsoleTransport = () => new winston.transports.Console({
'name': 'console-transport',
'handleExceptions': false,
'json': false,
'level': configuration.get('app.log.level'),
'timestamp': () => new Date().toISOString(),
'formatter': formatter
});
/**
* Get all configured transports.
*/
const getTransports = () => configuration.get('app.log.transports')
.map((transport) => {
if (transport.type === 'file') {
return getFileTransport(transport);
}
return getConsoleTransport();
});
/**
* Check if the given level is enabled.
* @param level
* @returns {boolean}
*/
const isLevelEnabled = (level) => {
const levelWeight = logLevelWeights[level];
const currentLevelWeigh = logLevelWeights[configuration.get('app.log.level')];
return levelWeight && levelWeight >= currentLevelWeigh;
};
/**
* Global logger. Lazy initialization.
*/
let logger = null;
/**
* Create a wrapper of winston's logger.
* @param name Logger's name.
* @returns {{debug: (function(*)), isDebugEnabled: (function(): boolean), info: (function(*): (*|void)), isInfoEnabled: (function(): boolean), warn: (function(*): (*|void)), isWarnEnabled: (function(): boolean), warning: (function(*): (*|void)), isWarningEnabled: (function(): boolean), error: (function(*)), isErrorEnabled: (function(): boolean)}}
*/
module.exports = (name) => {
if (!logger) {
// Lazy initialization of global logger.
const transports = getTransports();
logger = new winston.Logger({
'transports': transports,
'exitOnError': false
});
}
return {
'debug': (msg) => logger.debug(`[${name}] ${msg}`),
'isDebugEnabled': () => isLevelEnabled('debug'),
'info': (msg) => logger.info(`[${name}] ${msg}`),
'isInfoEnabled': () => isLevelEnabled('info'),
'warn': (msg) => logger.warn(`[${name}] ${msg}`),
'isWarnEnabled': () => isLevelEnabled('warn'),
'warning': (msg) => logger.warn(`[${name}] ${msg}`),
'isWarningEnabled': () => isLevelEnabled('warning'),
'error': (msg) => logger.error(`[${name}] ${msg}`),
'isErrorEnabled': () => isLevelEnabled('error')
};
};