node package manager


Lightweight logger with a simple pass-through configuration for use with fancier logging libraries


Lightweight logger with a simple pass-through configuration for use with fancier logging libraries. Used by the Sails framework. Optional support for colorized output, custom prefixes, and log levels (using npm's logging conventions.)

$ npm install captains-log
var log = require('captains-log')();

By default, if you just call log(), captains-log will write your log output at the "debug" log level. You can achieve the same effect by writing log.debug().

IMPORTANT NOTE: npm calls this level log.http(), but we call it debug. If you use log(), the logger sees this as a call to log.debug())

Here are all of the log-level-specific methods which are available in captains-log out of the box:


To use a different library, overrides.custom must already be instantiated and ready to go with (at minimum) an n-ary .debug() method.

var log = require('captains-log')({ custom: customLogger });
log('hello', 'world');
// yields => "Hello world" 

This assumes customLogger works as follows:

customLogger.debug('blah', 'foo')
customLogger.debug('blah', 'foo', {bar: 'baz'})
customLogger.debug('blah', 'foo', {bar: 'baz'}, ['a', 3], 2, false);
// etc. 

For example:

var customLogger = console.log.bind(console);

When an object is passed, and inspect is set to true (it is true, by default), you can configure the inner inspect function options, by passing an inspectOptions parameter:

var log = require('captains-log')({inspectOptions: {colors: true, depth: null}});
log('hello', 'world', {this:'is', a: 'nice', object: new Date()});

The previous code renders the object with colors.

Formerly, this module encapsulated winston, a popular logger by @indexzero and the gals/guys over at Nodejitsu. Recently, we made Winston optional to make captains-log as lightweight as possible and reduce the number of npm installs and require()s necessary for its usage in other modules.

But Winston is awesome! And it's a great fit for many apps, giving you granular control over how log output is handled, including sending emails, logging to multiple transports, and other production-time concerns.

To use boot up a captains-log that writes to Winston, do the following:

var log = require('captains-log')({
  custom: new (require('winston').Logger)({
    levels     : ...,
    transports : ...