diff --git a/index.js b/index.js index fb4cf9d..944c9f7 100644 --- a/index.js +++ b/index.js @@ -4,6 +4,8 @@ "use strict"; var assign = require("es5-ext/object/assign") + , objMap = require("es5-ext/object/map") + , primitiveSet = require("es5-ext/object/primitive-set") , setPrototypeOf = require("es5-ext/object/set-prototype-of") , ensureString = require("es5-ext/object/validate-stringifiable-value") , toShortString = require("es5-ext/to-short-string-representation") @@ -15,6 +17,18 @@ var emitter = ee(), cache = Object.create(null); var isValidLevel = RegExp.prototype.test.bind(/^[a-z]+$/); var isValidNsToken = RegExp.prototype.test.bind(/^[a-z0-9-]+$/); +var predefinedLevels = primitiveSet( + "debug", + "info", + "notice", + "warning", + "error", + "critical", + "alert", + "emergency" +); +var levelAliases = Object.create(null, { warn: d("cew", "warning") }); + var setEnabledState = function (state) { Object.defineProperty(this, "isEnabled", d("ce", state)); }; @@ -51,6 +65,11 @@ var loggerProto = Object.create( Function.prototype, assign( { isEnabled: d("e", true), emitter: d("", emitter), _nsToken: d("", null) }, + objMap(predefinedLevels, function (ignore, level) { + return d.gs(function () { + return this.getLevel(level); + }); + }), lazy({ ns: d( "e", @@ -118,13 +137,14 @@ createLogger = function () { }; createLevelLogger = function (level) { + if (levelAliases[level]) level = levelAliases[level]; if (cache[level]) return cache[level]; if (!isValidLevel(level)) { throw new TypeError( toShortString(level) + " is not a valid level name (only 'a-z' chars are allowed)" ); } - if (level in loggerProto) { + if (!predefinedLevels[level] && level in loggerProto) { throw new TypeError( toShortString(level) + " is not a valid level name (should not override existing property)" diff --git a/test/index.js b/test/index.js index eed1730..09c08de 100644 --- a/test/index.js +++ b/test/index.js @@ -170,6 +170,19 @@ test("Logger", function (t) { } ); + t.test("Should expose known (syslog) levels with predefined properties", function (t) { + t.equal(log.info, log.getLevel("info")); + t.equal(log.notice, log.getLevel("notice")); + t.equal(log.warning, log.getLevel("warning")); + t.equal(log.error, log.getLevel("error")); + t.equal(log.critical, log.getLevel("critical")); + t.equal(log.alert, log.getLevel("alert")); + t.equal(log.emergency, log.getLevel("emergency")); + t.end(); + }); + + t.equal(log.getLevel("warn"), log.warning, "Should alias 'warn' level to 'warning'"); + t.test("Should provide enable/disable functionality on level/name configuration", function (t) { t.equal(log.getNs("enabletest").isEnabled, true, "Should be enabled by default");