Skip to content

Commit ae27a19

Browse files
committed
Fixes #306: Can't set customlevels to my loggers (RangeError: Maximum call stack size exceeded)
1 parent 4134288 commit ae27a19

File tree

2 files changed

+63
-1
lines changed

2 files changed

+63
-1
lines changed

lib/winston/common.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ var util = require('util'),
2222
// for each of those levels.
2323
//
2424
exports.setLevels = function (target, past, current, isDefault) {
25+
var self = this;
2526
if (past) {
2627
Object.keys(past).forEach(function (level) {
2728
delete target[level];
@@ -38,6 +39,17 @@ exports.setLevels = function (target, past, current, isDefault) {
3839
// e.g. target.log('info', msg) <=> target.info(msg)
3940
//
4041
Object.keys(target.levels).forEach(function (level) {
42+
43+
// TODO Refactor logging methods into a different object to avoid name clashes
44+
if (level === 'log') {
45+
throw new Error('There cannot be a log level named "log" as it will clash with the method "log"');
46+
}
47+
48+
// TODO Discuss the right approach here
49+
if (target[level]) {
50+
console.warn('Logging method "' + level + '" overrides an existing property. Consider level renaming.');
51+
}
52+
4153
target[level] = function (msg) {
4254
// build argument list (level, msg, ... [string interpolate], [{metadata}], [callback])
4355
var args = [level].concat(Array.prototype.slice.call(arguments));

test/logger-levels-test.js

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,57 @@ vows.describe('winston/logger/levels').addBatch({
110110
"should join and have a meta object": function (transport, level, msg, meta) {
111111
assert.strictEqual(msg, 'test message first second');
112112
assert.deepEqual(meta, {number: 123});
113-
}
113+
}
114+
},
115+
"when custom levels are set": {
116+
"should not fail with 'RangeError: Maximum call stack size exceeded": function (logger) {
117+
var that = this;
118+
119+
// Logging levels
120+
var customLevels = {
121+
levels: {
122+
none: 0,
123+
log: 1,
124+
}
125+
};
126+
127+
var logger = winston.loggers.add('hello243', { });
128+
try {
129+
logger.setLevels(customLevels.levels);
130+
} catch (e) {
131+
assert.equal('Error', e.name);
132+
}
133+
try {
134+
logger.log('none', 'hi', function (err) {
135+
assert.ifError(err);
136+
});
137+
} catch (e) {
138+
assert.ifError(e);
139+
}
140+
},
141+
"should warn if logging level overrides a method": function (logger) {
142+
var that = this;
143+
144+
// Logging levels
145+
var customLevels = {
146+
levels: {
147+
none: 0,
148+
extend: 1,
149+
}
150+
};
151+
152+
// TODO Find a better way to do this
153+
var oldWarn = console.warn;
154+
console.warn = function (x) {
155+
assert.equal('Logging method "extend" overrides ' +
156+
'an existing property. Consider level renaming.', x);
157+
console.warn = oldWarn;
158+
};
159+
160+
var logger = winston.loggers.add('hello243', { });
161+
logger.setLevels(customLevels.levels);
162+
163+
}
114164
}
115165
}
116166
}).export(module);

0 commit comments

Comments
 (0)