Skip to content

Commit

Permalink
feat: configure log levels & log provider
Browse files Browse the repository at this point in the history
test: logger
  • Loading branch information
chimurai committed Sep 13, 2015
1 parent dd09c7d commit cb40b7d
Show file tree
Hide file tree
Showing 3 changed files with 208 additions and 32 deletions.
16 changes: 14 additions & 2 deletions lib/config-factory.js
Expand Up @@ -31,13 +31,15 @@ function createConfig (context, opts) {
config.options = _.assign(config.options, opts);
}

// Legacy option.proxyHost
config.options = mapLegacyProxyHostOption(config.options);
configureLogger(config.options);

if (!config.options.target) {
throw new Error('[HPM] Missing "target" option. Example: {target: "http://www.example.org"}');
}

// Legacy option.proxyHost
config.options = mapLegacyProxyHostOption(config.options);

return config;
};

Expand All @@ -62,3 +64,13 @@ function mapLegacyProxyHostOption (options) {

return options;
}

function configureLogger (options) {
if (options.logLevel) {
logger.setLevel(options.logLevel);
}

if (options.logProvider) {
logger.setProvider(options.provider);
}
}
71 changes: 41 additions & 30 deletions lib/logger.js
@@ -1,22 +1,6 @@
var loggerInstance;

module.exports = {
// singleton
getInstance : function () {
return loggerInstance || (loggerInstance = new Logger());
}
};
var _ = require('lodash');

// log level 'weight'
var LEVELS = {
debug : 1,
info : 2,
warn : 3,
error : 5,
silent : 8
}

var defaultLevel = 'info';
var loggerInstance;

var defaultProvider = {
log : console.log,
Expand All @@ -26,18 +10,44 @@ var defaultProvider = {
error : console.error
}

// log level 'weight'
var LEVELS = {
debug : 10,
info : 20,
warn : 30,
error : 50,
silent : 80
}

module.exports = {
// singleton
getInstance : function () {
if (!loggerInstance) {
loggerInstance = new Logger();
loggerInstance.setLevel('info');
loggerInstance.setProvider(defaultProvider);
}

return loggerInstance;
}
};

function Logger () {
var logLevel = defaultLevel; // default log level
var provider = console;
var logLevel;
var provider;

return {
log : log,
debug : debug,
info : info,
warn : warn,
error : error,
level : logLevel,
provider : defaultProvider
setLevel : function (v) {
logLevel = v;
},
setProvider : function (fn) {
provider = _.isFunction(fn) ? fn(defaultProvider) : defaultProvider;
}
}

// log will log messages, regardless of logLevels
Expand All @@ -46,45 +56,46 @@ function Logger () {
}

function debug () {
if (_isLevel('debug')) {
if (_showLevel('debug')) {
provider.debug.apply(null, arguments);
}
}

function info () {
if (_isLevel('info')) {
if (_showLevel('info')) {
provider.info.apply(null, arguments);
}
}

function warn () {
if (_isLevel('warn')) {
if (_showLevel('warn')) {
provider.warn.apply(null, arguments);
}
}

function error () {
if (_isLevel('error')) {
if (_showLevel('error')) {
provider.error.apply(null, arguments);
}
}

/**
* Decide to log or not to log, based on the log levels 'weight'
* @param {String} level [debug, info, warn, error, silent]
* @param {String} showLevel [debug, info, warn, error, silent]
* @return {Boolean}
*/
function _isLevel (level) {
function _showLevel (showLevel) {
var result = false;
var currentLogLevel = LEVELS[logLevel];

if (currentLogLevel && (currentLogLevel <= LEVELS[level])) {
if (currentLogLevel && (currentLogLevel <= LEVELS[showLevel])) {
result = true;
}

return result;
}

//TODO interpolate strings with util.format
// TODO interpolate strings with util.format
// Validate provider & log functions
}

153 changes: 153 additions & 0 deletions test/logger.spec.js
@@ -0,0 +1,153 @@
var expect = require('chai').expect;
var Logger = require('../lib/logger');

describe('Logger', function () {
var logger;
var logMessage, debugMessage, infoMessage, warnMessage, errorMessage;

beforeEach(function () {
logMessage = undefined;
debugMessage = undefined;
infoMessage = undefined;
warnMessage = undefined;
errorMessage = undefined;
});

beforeEach(function () {
logger = Logger.getInstance();
});

beforeEach(function () {
logger.setProvider(function (provider) {
provider.log = function (message) {logMessage = message};
provider.debug = function (message) {debugMessage = message};
provider.info = function (message) {infoMessage = message};
provider.warn = function (message) {warnMessage = message};
provider.error = function (message) {errorMessage = message};

return provider;
});
});

describe('logging with different levels', function () {
beforeEach(function () {
logger.log('log');
logger.debug('debug');
logger.info('info');
logger.warn('warn');
logger.error('error');
});

describe('level: debug', function () {
beforeEach(function () {
logger.setLevel('debug');
});

it('should log .log() messages', function () {
expect(logMessage).to.equal('log');
});
it('should log .debug() messages', function () {
expect(debugMessage).to.equal('debug');
});
it('should log .info() messages', function () {
expect(infoMessage).to.equal('info');
});
it('should log .warn() messages', function () {
expect(warnMessage).to.equal('warn');
});
it('should log .error() messages', function () {
expect(errorMessage).to.equal('error');
});
});

describe('level: info', function () {
beforeEach(function () {
logger.setLevel('info');
});

it('should log .log() messages', function () {
expect(logMessage).to.equal('log');
});
it('should not log .debug() messages', function () {
expect(debugMessage).to.equal(undefined);
});
it('should log .info() messages', function () {
expect(infoMessage).to.equal('info');
});
it('should log .warn() messages', function () {
expect(warnMessage).to.equal('warn');
});
it('should log .error() messages', function () {
expect(errorMessage).to.equal('error');
});
});

describe('level: warn', function () {
beforeEach(function () {
logger.setLevel('warn');
});

it('should log .log() messages', function () {
expect(logMessage).to.equal('log');
});
it('should not log .debug() messages', function () {
expect(debugMessage).to.equal(undefined);
});
it('should not log .info() messages', function () {
expect(infoMessage).to.equal(undefined);
});
it('should log .warn() messages', function () {
expect(warnMessage).to.equal('warn');
});
it('should log .error() messages', function () {
expect(errorMessage).to.equal('error');
});
});

describe('level: error', function () {
beforeEach(function () {
logger.setLevel('error');
});

it('should log .log() messages', function () {
expect(logMessage).to.equal('log');
});
it('should not log .debug() messages', function () {
expect(debugMessage).to.equal(undefined);
});
it('should not log .info() messages', function () {
expect(infoMessage).to.equal(undefined);
});
it('should log .warn() messages', function () {
expect(warnMessage).to.equal(undefined);
});
it('should log .error() messages', function () {
expect(errorMessage).to.equal('error');
});
});

describe('level: silent', function () {
beforeEach(function () {
logger.setLevel('silent');
});

it('should log .log() messages', function () {
expect(logMessage).to.equal('log');
});
it('should not log .debug() messages', function () {
expect(debugMessage).to.equal(undefined);
});
it('should not log .info() messages', function () {
expect(infoMessage).to.equal(undefined);
});
it('should not log .warn() messages', function () {
expect(warnMessage).to.equal(undefined);
});
it('should not log .error() messages', function () {
expect(errorMessage).to.equal(undefined);
});
});
});
});


0 comments on commit cb40b7d

Please sign in to comment.