Skip to content

Commit

Permalink
[api test doc] Small updates to docs. Make instances of transports on…
Browse files Browse the repository at this point in the history
… logger objects lower-case variable names. Improved defaultLogger usage through require("winston").log()
  • Loading branch information
indexzero committed Jan 13, 2011
1 parent b18dad9 commit 20698a9
Show file tree
Hide file tree
Showing 9 changed files with 113 additions and 27 deletions.
30 changes: 27 additions & 3 deletions README.md
Expand Up @@ -25,7 +25,31 @@ Winston is designed to be a simple and universal logging library with support fo

## Inspirations

## Tests
## Run Tests
All of the winston tests are written in [vows][1], and cover all of the use cases described above. You will need to add valid credentials for the various transports included to test/test-config.json before running tests:
<pre>
{
"transports": {
"console": {},
"riak": {},
"loggly": {
"subdomain": "your-subdomain",
"inputToken": "really-long-token-you-got-from-loggly",
"auth": {
"username": "your-username",
"password": "your-password"
}
}
}
}
</pre>

Once you have valid Rackspace credentials you can run tests with [vows][1]:
<pre>
vows test/*-test.js --spec
</pre>

#### Author: [Charlie Robbins](http://twitter.com/indexzero)
#### Contributors: [Matthew Bergman](http://github.com/fotoverite)

## Author: [Charlie Robbins](http://twitter.com/indexzero)
## Contributors: [Matthew Bergman](http://github.com/fotoverite)
[1]: http://vowsjs.org
30 changes: 25 additions & 5 deletions lib/winston.js
Expand Up @@ -12,12 +12,32 @@ winston.default = {};
winston.transports = require('./winston/transports');
winston.Logger = require('./winston/logger').Logger;

winston.defaultLogger = new (winston.Logger)({transports: {"Console": {level: 2}}});
//
// We create and expose a "defaultLogger" so that the programmer may do the
// following without the need to create an instance of winston.Logger directly:
// var winston = require('winston');
// winston.log('info', 'some message');
// winston.error('some error');
//
var defaultLogger = new (winston.Logger)({ transports: { "Console": winston.default } });
Object.keys(defaultLogger.levels).forEach(function (level) {
winston[level] = function () {
defaultLogger[level].apply(defaultLogger, arguments);
};
});

winston.add = function (transport, options) {

winston.log = function () {
defaultLogger.log.apply(defaultLogger, arguments);
}

winston.defaultTransports = function () {
return defaultLogger.transports;
};

winston.add = function () {
defaultLogger.add.apply(defaultLogger, arguments);
};

winston.remove = function (transport) {

winston.remove = function () {
defaultLogger.remove.apply(defaultLogger, arguments);
};
22 changes: 12 additions & 10 deletions lib/winston/logger.js
Expand Up @@ -61,7 +61,7 @@ Object.keys(levels).forEach(function (level) {
//
Logger.prototype.log = function (level, msg) {
var self = this, logged = 0, errs = [],
meta, callback, len = this.transports.length;
meta, callback, len = Object.keys(this.transports).length;

if (arguments.length === 3) {
meta = {};
Expand All @@ -71,9 +71,9 @@ Logger.prototype.log = function (level, msg) {
meta = arguments[2];
callback = arguments[3];
}

if (this.transports.length === 0) return callback(new Error('Cannot log with no transports.'));
else if (!levels[level]) return callback(new Error('Unknown log level: ' + level));
else if (typeof levels[level] === 'undefined') return callback(new Error('Unknown log level: ' + level));

for (var key in this.transports) {
var transport = this.transports[key];
Expand All @@ -84,24 +84,26 @@ Logger.prototype.log = function (level, msg) {
if (err && self.emitErrs) return self.emit('error', err, transport);

self.emit('log', transport, level, msg, meta);
if (++logged == len && callback) callback(errs ? errs : null);
if (++logged == len && callback) callback(errs.length > 0 ? errs : null);
});
}
};
};

Logger.prototype.add = function (transport, options) {
transport = capitalize(transport);
var proto = Object.keys(transports).filter(function (k) { return k === transport });
if (proto.length === 0) throw new Error('Cannot find Transport: ' + transport);
else if (this.transports[transport]) throw new Error('Transport already attached: ' + transport);
var name = capitalize(transport),
proto = Object.keys(transports).filter(function (k) { return k === name });

transport = transport.toLowerCase();
if (proto.length === 0) throw new Error('Cannot find Transport: ' + name);
else if (this.transports[transport]) throw new Error('Transport already attached: ' + name);

this.transports[transport] = (new (transports[transport])(options));
this.transports[transport] = (new (transports[name])(options));
return this;
};

Logger.prototype.remove = function (transport) {
transport = capitalize(transport);
transport = transport.toLowerCase();
if (!this.transports[transport]) throw new Error('Transport ' + transport + ' not attached to this instance');

var transportObject = this.transports[transport];
Expand Down
2 changes: 1 addition & 1 deletion lib/winston/transports.js
Expand Up @@ -9,5 +9,5 @@
var transports = exports;

transports.Console = require('./transports/console').Console;
transports.Loggly = require('./transports/loggly').Loggly;
transports.Loggly = require('./transports/loggly').Loggly;
transports.Riak = require('./transports/riak').Riak;
2 changes: 1 addition & 1 deletion test/console-test.js
Expand Up @@ -21,7 +21,7 @@ vows.describe('winston/transports/console').addBatch({
"should have the proper methods defined": function () {
helpers.assertConsole(transport);
},
"the log() method": helpers.testLevels(transport, "should respond with true", function (err, logged) {
"the log() method": helpers.testLevels(transport, "should respond with true", function (ign, err, logged) {
assert.isNull(err);
assert.isTrue(logged);
})
Expand Down
4 changes: 2 additions & 2 deletions test/helpers.js
Expand Up @@ -74,7 +74,7 @@ helpers.testLevels = function (transport, assertMsg, assertFn) {
Object.keys(winston.Logger.prototype.levels).forEach(function (level) {
var test = {
topic: function () {
transport.log(level, 'test message', {}, this.callback);
transport.log(level, 'test message', {}, this.callback.bind(this, null));
}
};

Expand All @@ -84,7 +84,7 @@ helpers.testLevels = function (transport, assertMsg, assertFn) {

var test = {
topic: function () {
transport.log('info', 'test message', { metadata: true }, this.callback);
transport.log('info', 'test message', { metadata: true }, this.callback.bind(this, null));
}
};

Expand Down
8 changes: 4 additions & 4 deletions test/logger-test.js
Expand Up @@ -38,7 +38,7 @@ vows.describe('winton/logger').addBatch({
},
"should add the console Transport onto transports": function (logger) {
assert.equal(helpers.size(logger.transports), 1);
helpers.assertConsole(logger.transports.Console);
helpers.assertConsole(logger.transports.console);
},
"should throw an error when the same Transport is added": function (logger) {
assert.throws(function () { logger.add('console') }, Error);
Expand All @@ -58,8 +58,8 @@ vows.describe('winton/logger').addBatch({
},
"should be able to add multiple transports": function (logger) {
assert.equal(helpers.size(logger.transports), 2);
helpers.assertConsole(logger.transports.Console);
helpers.assertRiak(logger.transports.Riak);
helpers.assertConsole(logger.transports.console);
helpers.assertRiak(logger.transports.riak);
}
}
}
Expand All @@ -81,7 +81,7 @@ vows.describe('winton/logger').addBatch({
},
"should remove the Console transport from transports": function (logger) {
assert.equal(helpers.size(logger.transports), 1);
helpers.assertRiak(logger.transports.Riak);
helpers.assertRiak(logger.transports.riak);
},
"and removing an additional transport": {
topic: function (logger) {
Expand Down
2 changes: 1 addition & 1 deletion test/loggly-test.js
Expand Up @@ -22,7 +22,7 @@ vows.describe('winston/transports/loggly').addBatch({
"should have the proper methods defined": function () {
helpers.assertLoggly(transport);
},
"the log() method": helpers.testLevels(transport, "should log messages to loggly", function (err, result) {
"the log() method": helpers.testLevels(transport, "should log messages to loggly", function (ign, err, result) {
assert.isNull(err);
assert.isObject(result);
assert.equal(result.response, 'ok');
Expand Down
40 changes: 40 additions & 0 deletions test/winston-test.js
@@ -0,0 +1,40 @@
/*
* logger-test.js: Tests for instances of the winston Logger
*
* (C) 2010 Charlie Robbins
* MIT LICENSE
*
*/

require.paths.unshift(require('path').join(__dirname, '..', 'lib'));

var path = require('path'),
vows = require('vows'),
assert = require('assert'),
winston = require('winston'),
helpers = require('./helpers');

vows.describe('winston').addBatch({
"The winston module": {
topic: function () {
winston.defaultTransports().console.level = 'silly';
return null;
},
"should have the correct methods defined": function () {
assert.isObject(winston.transports);
assert.isFunction(winston.transports.Console);
assert.isFunction(winston.transports.Loggly);
assert.isFunction(winston.transports.Riak);
assert.isObject(winston.defaultTransports().console);

['Logger', 'defaultTransports', 'add', 'remove']
.concat(Object.keys(winston.Logger.prototype.levels))
.forEach(function (m) {
assert.isFunction(winston[m]);
});
},
"the log() method": helpers.testLevels(winston, "should respond without an error", function (err) {
assert.isNull(err);
})
}
}).export(module);

0 comments on commit 20698a9

Please sign in to comment.