create logger instance per Ajv instance

master
Meir Rotstein 2017-11-19 17:34:42 +02:00
parent 4cdfcaaffc
commit e0c7eac50d
5 changed files with 63 additions and 59 deletions

View File

@ -10,7 +10,7 @@ var compileSchema = require('./compile')
, $dataMetaSchema = require('./$data')
, patternGroups = require('./patternGroups')
, util = require('./compile/util')
, logger = require('./compile/logger')
, Logger = require('./compile/logger')
, co = require('co');
module.exports = Ajv;
@ -53,6 +53,7 @@ var META_SUPPORT_DATA = ['/properties'];
function Ajv(opts) {
if (!(this instanceof Ajv)) return new Ajv(opts);
opts = this._opts = util.copy(opts) || {};
setLogger(this);
this._schemas = {};
this._refs = {};
this._fragments = {};
@ -76,7 +77,6 @@ function Ajv(opts) {
if (typeof opts.meta == 'object') this.addMetaSchema(opts.meta);
addInitialSchemas(this);
if (opts.patternGroups) patternGroups(this);
if (opts.logger !== undefined) setLogger(this);
}
@ -168,7 +168,7 @@ function validateSchema(schema, throwOrLogError) {
throw new Error('$schema must be a string');
$schema = $schema || this._opts.defaultMeta || defaultMeta(this);
if (!$schema) {
logger.warn('meta-schema not available');
this.logger.warn('meta-schema not available');
this.errors = null;
return true;
}
@ -181,7 +181,7 @@ function validateSchema(schema, throwOrLogError) {
finally { this._formats.uri = currentUriFormat; }
if (!valid && throwOrLogError) {
var message = 'schema is invalid: ' + this.errorsText();
if (this._opts.validateSchema == 'log') logger.error(message);
if (this._opts.validateSchema == 'log') this.logger.error(message);
else throw new Error(message);
}
return valid;
@ -380,15 +380,15 @@ function chooseGetId(opts) {
}
}
/* @this Ajv */
function _getId(schema) {
if (schema.$id) logger.warn('schema $id ignored', schema.$id);
if (schema.$id) this.logger.warn('schema $id ignored', schema.$id);
return schema.id;
}
/* @this Ajv */
function _get$Id(schema) {
if (schema.id) logger.warn('schema id ignored', schema.id);
if (schema.id) this.logger.warn('schema id ignored', schema.id);
return schema.$id;
}
@ -479,6 +479,10 @@ function getMetaSchemaOptions(self) {
}
function setLogger(self) {
if(self._opts.logger === false) logger.set(null);
if(typeof self._opts.logger === 'object') logger.set(self._opts.logger);
var loggerObj;
if(self._opts.logger === false) loggerObj = null;
if(typeof self._opts.logger === 'object') loggerObj = self._opts.logger;
self.logger = new Logger(loggerObj);
}

View File

@ -3,8 +3,7 @@
var resolve = require('./resolve')
, util = require('./util')
, errorClasses = require('./error_classes')
, stableStringify = require('fast-json-stable-stringify')
, logger = require('./logger');
, stableStringify = require('fast-json-stable-stringify');
var validateGenerator = require('../dotjs/validate');
@ -105,7 +104,7 @@ function compile(schema, root, localRefs, baseId) {
useCustomRule: useCustomRule,
opts: opts,
formats: formats,
logger: logger,
logger: self.logger,
self: self
});
@ -148,7 +147,7 @@ function compile(schema, root, localRefs, baseId) {
refVal[0] = validate;
} catch(e) {
logger.error('Error compiling schema, function code:', sourceCode);
self.logger.error('Error compiling schema, function code:', sourceCode);
throw e;
}
@ -262,7 +261,7 @@ function compile(schema, root, localRefs, baseId) {
var valid = validateSchema(schema);
if (!valid) {
var message = 'keyword schema is invalid: ' + self.errorsText(validateSchema.errors);
if (self._opts.validateSchema == 'log') logger.error(message);
if (self._opts.validateSchema == 'log') self.logger.error(message);
else throw new Error(message);
}
}

View File

@ -1,47 +1,41 @@
'use strict';
var logger;
module.exports = Logger;
_reset();
/**
* @constructor
* @this Logger
* @param {*=} loggerObj logger object, expected to implement log, warn and error, if not given global console will be taken.
*/
function Logger(loggerObj) {
if(loggerObj && typeof loggerObj === 'object')
this.logger = loggerObj;
else if(typeof loggerObj === 'undefined')
this.logger = typeof console === 'object' ? console : {log: noop, warn: noop, error: noop};
else
this.logger = null;
}
module.exports = {
log: _logFunc('log'),
warn: _logFunc('warn'),
error: _logFunc('error'),
set: _setLogger,
reset: _reset
Logger.prototype.log = function() {
_logFunc.call(this, 'log', arguments);
};
Logger.prototype.warn = function() {
_logFunc.call(this, 'warn', arguments);
};
Logger.prototype.error = function() {
_logFunc.call(this, 'error', arguments);
};
/**
* @this Logger
* @param {String} level log level - log, warn or error
* @return {Function} log function
* @param {Array} args log argumets
* @private
*/
function _logFunc(level) {
/**
* @this Ajv
*/
return function() {
if(logger && logger[level]) logger[level].apply(this, arguments);
};
}
/**
* Set actual logger object, in order to disable the logger send non object or null
* @param {*} loggerObj logger object, expected to implement log, warn and error, if not it gets noop implementation.
*/
function _setLogger(loggerObj) {
if(loggerObj && typeof loggerObj === 'object')
logger = loggerObj;
else
logger = null;
}
/**
* Reset logger to global console
*/
function _reset() {
logger = typeof console === 'object' ? console : {log: noop, warn: noop, error: noop};
function _logFunc(level, args) {
if(this.logger && this.logger[level]) this.logger[level].apply(this, args);
}
function noop() {}

View File

@ -1,9 +1,12 @@
'use strict';
var logger = require('../lib/compile/logger')
var Logger = require('../lib/compile/logger')
, should = require('./chai').should();
describe('logger object tests', function() {
var logger;
var origConsoleWarn = console.warn;
var origConsoleLog = console.log;
var origConsoleError = console.error;
@ -32,11 +35,13 @@ describe('logger object tests', function() {
console.warn = origConsoleWarn;
console.log = origConsoleLog;
console.error = origConsoleError;
logger.reset();
consoleErrorCalled = consoleLogCalled = consoleWarnCalled = false;
});
it('logger should log into global console by default', function() {
logger = new Logger();
logger.log('42');
logger.warn('42');
logger.error('42');
@ -46,8 +51,7 @@ describe('logger object tests', function() {
should.equal(consoleErrorCalled, true);
});
it('logger should log only into a custom logger if given console by default', function() {
it('logger should log only into a custom logger if given', function() {
var customWarnCalled = false;
var customLogCalled = false;
var customErrorCalled = false;
@ -64,7 +68,8 @@ describe('logger object tests', function() {
}
};
logger.set(customLogger);
logger = new Logger(customLogger);
logger.log('42');
logger.warn('42');
logger.error('42');
@ -79,7 +84,8 @@ describe('logger object tests', function() {
});
it('if a custom logger is given without basic logging functions implementations it should not leads to an exception', function() {
logger.set({});
logger = new Logger({});
logger.log('42');
logger.warn('42');
logger.error('42');
@ -90,7 +96,8 @@ describe('logger object tests', function() {
});
it('if a custom logger is set to null logging should be disabled', function() {
logger.set(null);
logger = new Logger(null);
logger.log('42');
logger.warn('42');
logger.error('42');

View File

@ -1240,7 +1240,7 @@ describe('Ajv Options', function () {
consoleCalled = false;
});
it('logger is undefined - global console should be in use', function() {
it('no custom logger is given - global console should be in use', function() {
var ajv = new Ajv({
meta: false
@ -1254,7 +1254,7 @@ describe('Ajv Options', function () {
should.equal(consoleCalled, true);
});
it('logger is an object - logs should only reported to it', function() {
it('custom logger is an object - logs should only reported to it', function() {
var loggerCalled = false;
@ -1278,7 +1278,7 @@ describe('Ajv Options', function () {
should.equal(consoleCalled, false);
});
it('logger is an object but not implements the basic functions - make sure that it not leads to an error', function() {
it('custom logger is an object but not implements the basic functions - make sure that it not leads to an error', function() {
var logger = {};