create logger instance per Ajv instance
parent
4cdfcaaffc
commit
e0c7eac50d
24
lib/ajv.js
24
lib/ajv.js
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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() {}
|
|
@ -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');
|
||||
|
|
|
@ -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 = {};
|
||||
|
||||
|
|
Loading…
Reference in New Issue