10000 Merge pull request #390 from AllClassPenguin/custom-levels · xcj-coding/log4js-node@60c48a5 · GitHub
[go: up one dir, main page]

Skip to content

Commit 60c48a5

Browse files
authored
Merge pull request log4js-node#390 from AllClassPenguin/custom-levels
Custom levels
2 parents 92333e2 + 81b2328 commit 60c48a5

File tree

5 files changed

+203
-32
lines changed

5 files changed

+203
-32
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# log4js-node [![Build Status](https://secure.travis-ci.org/nomiddlename/log4js-node.png?branch=master)](http://travis-ci.org/nomiddlename/log4js-node)
22

33
[![NPM](https://nodei.co/npm/log4js.png?downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/log4js/)
4-
4+
55
This is a conversion of the [log4js](https://github.com/stritti/log4js)
66
framework to work with [node](http://nodejs.org). I've mainly stripped out the browser-specific code and tidied up some of the javascript.
77

lib/levels.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ function toLevel(sArg, defaultLevel) {
1616
if (!sArg) {
1717
return defaultLevel;
1818
}
19+
if (sArg instanceof Level) {
20+
module.exports[sArg.toString()] = sArg;
21+
return sArg;
22+
}
1923
if (typeof sArg === "string") {
2024
return module.exports[sArg.toUpperCase()] || defaultLevel;
2125
}
@@ -41,7 +45,7 @@ Level.prototype.isGreaterThanOrEqualTo = function(otherLevel) {
4145
};
4246

4347
Level.prototype.isEqualTo = function(otherLevel) {
44-
if (typeof otherLevel == "string") {
48+
if (typeof otherLevel === "string") {
4549
otherLevel = toLevel(otherLevel);
4650
}
4751
return this.level === otherLevel.level;
@@ -57,5 +61,6 @@ module.exports = {
5761
FATAL: new Level(50000, "FATAL"),
5862
MARK: new Level(9007199254740992, "MARK"), // 2^53
5963
OFF: new Level(Number.MAX_VALUE, "OFF"),
60-
toLevel: toLevel
64+
toLevel: toLevel,
65+
Level: Level
6166
};

lib/log4js.js

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,24 @@ function hasLogger(logger) {
7070
return loggers.hasOwnProperty(logger);
7171
}
7272

73+
levels.forName = function(levelStr, levelVal) {
74+
var level;
75+
if (typeof levelStr === "string" && typeof levelVal === "number") {
76+
var levelUpper = levelStr.toUpperCase();
77+
level = new levels.Level(levelVal, levelUpper);
78+
loggerModule.addLevelMethods(level);
79+
}
80+
return level;
81+
};
82+
83+
levels.getLevel = function(levelStr) {
84+
var level;
85+
if (typeof levelStr === "string") {
86+
var levelUpper = levelStr.toUpperCase();
87+
level = levels.toLevel(levelStr);
88+
}
89+
return level;
90+
};
7391

7492
function getBufferedLogger(categoryName) {
7593
var base_logger = getLogger(categoryName);
@@ -97,7 +115,7 @@ function normalizeCategory (category) {
97115
return category + '.';
98116
}
99117

100-
function doesLevelEntryContainsLogger (levelCategory, loggerCategory) {
118+
function doesLevelEntryContainsLogger (levelCategory, loggerCategory) {
101119
var normalizedLevelCategory = normalizeCategory(levelCategory);
102120
var normalizedLoggerCategory = normalizeCategory(loggerCategory);
103121
return normalizedLoggerCategory.substring(0, normalizedLevelCategory.length) == normalizedLevelCategory; //jshint ignore:line
@@ -142,7 +160,7 @@ function getLogger (loggerCategoryName) {
142160
}
143161
}
144162
/* jshint +W073 */
145-
163+
146164
// Create the logger for this name if it doesn't already exist
147165
loggers[loggerCategoryName] = new Logger(loggerCategoryName, level);
148166

@@ -165,7 +183,7 @@ function getLogger (loggerCategoryName) {
165183
});
166184
}
167185
}
168-
186+
169187
return loggers[loggerCategoryName];
170188
}
171189

@@ -182,10 +200,10 @@ function addAppender () {
182200
if (Array.isArray(args[0])) {
183201
args = args[0];
184202
}
185-
203+
186204
args.forEach(function(appenderCategory) {
187205
addAppenderToCategory(appender, appenderCategory);
188-
206+
189207
if (appenderCategory === ALL_CATEGORIES) {
190208
addAppenderToAllLoggers(appender);
191209
} else {
@@ -195,7 +213,7 @@ function addAppender () {
195213
loggers[loggerCategory].addListener("log", appender);
196214
}
197215
}
198-
216+
199217
}
200218
});
201219
}
@@ -288,15 +306,15 @@ function configureOnceOff(config, options) {
288306
try {
289307
configureLevels(config.levels);
290308
configureAppenders(config.appenders, options);
291-
309+
292310
if (config.replaceConsole) {
293311
replaceConsole();
294312
} else {
295313
restoreConsole();
296314
}
297315
} catch (e) {
298316
throw new Error(
299-
"Problem reading log4js config " + util.inspect(config) +
317+
"Problem reading log4js config " + util.inspect(config) +
300318
". Error was \"" + e.message + "\" (" + e.stack + ")"
301319
);
302320
}
@@ -306,7 +324,7 @@ function configureOnceOff(config, options) {
306324
function reloadConfiguration(options) {
307325
var mtime = getMTime(configState.filename);
308326
if (!mtime) return;
309-
327+
310328
if (configState.lastMTime && (mtime.getTime() > configState.lastMTime.getTime())) {
311329
configureOnceOff(loadConfigurationFile(configState.filename), options);
312330
}
@@ -337,7 +355,7 @@ function configure(configurationFileOrObject, options) {
337355
var config = configurationFileOrObject;
338356
config = config || process.env.LOG4JS_CONFIG;
339357
options = options || {};
340-
358+
341359
if (config === undefined || config === null || typeof(config) === 'string') {
342360
if (options.reloadSecs) {
343361
initReloadConfiguration(config, options);
@@ -463,19 +481,19 @@ module.exports = {
463481
getLogger: getLogger,
464482
getDefaultLogger: getDefaultLogger,
465483
hasLogger: hasLogger,
466-
484+
467485
addAppender: addAppender,
468486
loadAppender: loadAppender,
469487
clearAppenders: clearAppenders,
470488
configure: configure,
471489
shutdown: shutdown,
472-
490+
473491
replaceConsole: replaceConsole,
474492
restoreConsole: restoreConsole,
475-
493+
476494
levels: levels,
477495
setGlobalLogLevel: setGlobalLogLevel,
478-
496+
479497
layouts: layouts,
480498
appenders: {},
481499
appenderMakers: appenderMakers,

lib/logger.js

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -68,24 +68,33 @@ Logger.prototype.isLevelEnabled = function(otherLevel) {
6868

6969
['Trace','Debug','Info','Warn','Error','Fatal', 'Mark'].forEach(
7070
function(levelString) {
71-
var level = levels.toLevel(levelString);
72-
Logger.prototype['is'+levelString+'Enabled'] = function() {
73-
return this.isLevelEnabled(level);
7 93C6 4-
};
75-
76-
Logger.prototype[levelString.toLowerCase()] = function () {
77-
if (logWritesEnabled && this.isLevelEnabled(level)) {
78-
var numArgs = arguments.length;
79-
var args = new Array(numArgs);
80-
for (var i = 0; i < numArgs; i++) {
81-
args[i] = arguments[i];
82-
}
83-
this._log(level, args);
84-
}
85-
};
71+
addLevelMethods(levelString);
8672
}
8773
);
8874

75+
function addLevelMethods(level) {
76+
level = levels.toLevel(level);
77+
78+
var levelStrLower = level.toString().toLowerCase();
79+
var levelMethod = levelStrLower.replace(/_([a-z])/g, function(g) { return g[1].toUpperCase(); } );
80+
var isLevelMethod = levelMethod[0].toUpperCase() + levelMethod.slice(1);
81+
82+
Logger.prototype['is'+isLevelMethod+'Enabled'< F438 span class=pl-kos>] = function() {
83+
return this.isLevelEnabled(level.toString());
84+
};
85+
86+
Logger.prototype[levelMethod] = function () {
87+
if (logWritesEnabled && this.isLevelEnabled(level)) {
88+
var numArgs = arguments.length;
89+
var args = new Array(numArgs);
90+
for (var i = 0; i < numArgs; i++) {
91+
args[i] = arguments[i];
92+
}
93+
this._log(level, args);
94+
}
95+
};
96+
}
97+
8998
Logger.prototype._log = function(level, data) {
9099
var loggingEvent = new LoggingEvent(this.category, level, data, this);
91100
this.emit('log', loggingEvent);
@@ -111,3 +120,4 @@ exports.LoggingEvent = LoggingEvent;
111120
exports.Logger = Logger;
112121
exports.disableAllLogWrites = disableAllLogWrites;
113122
exports.enableAllLogWrites = enableAllLogWrites;
123+
exports.addLevelMethods = addLevelMethods;

test/newLevel-test.js

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
"use strict";
2+
var vows = require('vows')
3+
, assert = require('assert')
4+
, Level = require('../lib/levels')
5+
, log4js = require('../lib/log4js')
6+
, loggerModule = require('../lib/logger')
7+
, Logger = loggerModule.Logger;
8+
9+
vows.describe('../lib/logger').addBatch({
10+
'creating a new log level': {
11+
topic: function () {
12+
Level.forName("DIAG", 6000);
13+
return new Logger();
14+
},
15+
16+
'should export new log level in levels module': function (logger) {
17+
assert.isDefined(Level.DIAG);
18+
assert.equal(Level.DIAG.levelStr, "DIAG");
19+
assert.equal(Level.DIAG.level, 6000);
20+
},
21+
22+
'should create named function on logger prototype': function(logger) {
23+
assert.isFunction(logger.diag);
24+
},
25+
26+
'should create isLevelEnabled function on logger prototype': function(logger) {
27+
assert.isFunction(logger.isDiagEnabled);
28+
},
29+
},
30+
31+
'creating a new log level with underscores': {
32+
topic: function () {
33+
Level.forName("NEW_LEVEL_OTHER", 6000);
34+
return new Logger();
35+
},
36+
37+
'should export new log level to levels module': function (logger) {
38+
assert.isDefined(Level.NEW_LEVEL_OTHER);
39+
assert.equal(Level.NEW_LEVEL_OTHER.levelStr, "NEW_LEVEL_OTHER");
40+
assert.equal(Level.NEW_LEVEL_OTHER.level, 6000);
41+
},
42+
43+
'should create named function on logger prototype in camel case': function(logger) {
44+
assert.isFunction(logger.newLevelOther);
45+
},
46+
47+
'should create named isLevelEnabled function on logger prototype in camel case':
48+
function(logger) {
49+
assert.isFunction(logger.isNewLevelOtherEnabled);
50+
}
51+
},
52+
53+
'creating log events containing newly created log level': {
54+
topic: function() {
55+
var events = [],
56+
logger = new Logger();
57+
logger.addListener("log", function (logEvent) { events.push(logEvent); });
58+
59+
logger.log(Level.forName("LVL1", 6000), "Event 1");
60+
logger.log(Level.getLevel("LVL1"), "Event 2");
61+
logger.log("LVL1", "Event 3");
62+
logger.lvl1("Event 4");
63+
64+
logger.setLevel(Level.forName("LVL2", 7000));
65+
logger.lvl1("Event 5");
66+
67+
return events;
68+
},
69+
70+
'should show log events with new log level': function(events) {
71+
assert.equal(events[0].level.toString(), "LVL1");
72+
assert.equal(events[0].data[0], "Event 1");
73+
74+
assert.equal(events[1].level.toString(), "LVL1");
75+
assert.equal(events[1].data[0], "Event 2");
76+
77+
assert.equal(events[2].level.toString(), "LVL1");
78+
assert.equal(events[2].data[0], "Event 3");
79+
80+
assert.equal(events[3].level.toString(), "LVL1");
81+
assert.equal(events[3].data[0], "Event 4");
82+
},
83+
84+
'should not be present if min log level is greater than newly created level':
85+
function(events) {
86+
assert.equal(events.length, 4);
87+
}
88+
},
89+
90+
'creating a new log level with incorrect parameters': {
91+
topic: function() {
92+
log4js.levels.forName(9000, "FAIL_LEVEL_1");
93+
log4js.levels.forName("FAIL_LEVEL_2");
94+
return new Logger();
95+
},
96+
97+
'should fail to create the level': function(logger) {
98+
assert.isUndefined(Level.FAIL_LEVEL_1);
99+
assert.isUndefined(Level.FAIL_LEVEL_2);
100+
}
101+
},
102+
103+
'calling log with an undefined log level': {
104+
topic: function() {
105+
var events = [],
106+
logger = new Logger();
107+
logger.addListener("log", function (logEvent) { events.push(logEvent); });
108+
109+
logger.log("LEVEL_DOES_NEXT_EXIST", "Event 1");
110+
logger.log(Level.forName("LEVEL_DOES_NEXT_EXIST"), "Event 2");
111+
112+
return events;
113+
},
114+
115+
'should fallback to the default log level (INFO)': function(events) {
116+
assert.equal(events[0].level.toString(), "INFO");
117+
assert.equal(events[1].level.toString(), "INFO");
118+
}
119+
},
120+
121+
'creating a new level with an existing level name': {
122+
topic: function() {
123+
var events = [],
124+
logger = new Logger();
125+
logger.addListener("log", function (logEvent) { events.push(logEvent); });
126+
127+
logger.log(log4js.levels.forName("MY_LEVEL", 9000), "Event 1");
128+
logger.log(log4js.levels.forName("MY_LEVEL", 8000), "Event 1");
129+
130+
return events;
131+
},
132+
133+
'should override the existing log level': function(events) {
134+
assert.equal(events[0].level.level, 9000);
135+
assert.equal(events[1].level.level, 8000);
136+
}
137+
}
138+
}).exportTo(module);

0 commit comments

Comments
 (0)
0