UNPKG

rest-api-starter

Version:
129 lines (110 loc) 3.54 kB
/** * Created by svinci on 11/27/16. */ 'use strict'; 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') }; };