A logger.

Usage no npm install needed!

<script type="module">
  import vertexLogger from '';


npm Build Status Coverage Status


A logger.

npm install vertex-logger --save

const VertexLogger = require('vertex-logger');

const logger = new VertexLogger({
  root: 'root',
  name: 'name',
  level: 'info' // off fatal error warn info debug trace

logger.level = 'debug'; // reset level'interpo%s st%s', 'lated', 'ring');
// if stdout is TTY:
//   [ info] (root/name) interpolated string (201ms)
// if not:
//   2016-10-21 14:11:31.471 [ info] (root/name) interpolated string (201ms)

logger.fatal(); // to stderr
logger.error(); // to stderr
logger.warn();  // to stdout;  // to stdout
logger.debug(); // to stdout
logger.trace(); // to stdout

logger.error("couldn't", new Error('Why'));
// [error] (root/name) couldn't (1231ms)
// Error: Why
//     at repl:1:25
//     at sigintHandlersWrap (vm.js:22:35)
//     at sigintHandlersWrap (vm.js:96:12)
//     ...

A tree of loggers...

...can be built for context.

let appLogger = new VertexLogger({
  root: 'app-name',
  name: 'application'

let serviceLogger = appLogger.createLogger({
  name: 'service-name'

let componentLogger = serviceLogger.createLogger({
  name: 'component-name'

// Log messages only display 'root/name' and not 'root/parent/parent/name'
// eg.'message');
// [ info] (app-name/component-name) message (0ms)

A repl

…can be registered via any logger in the tree

let logger = new VertexLogger();
let repl = require('repl').start();

logger.repl = repl; // to register the repl

// now the repl prompt will remain continuously below the latest logged message

logger.repl = undefined // to unregister the repl

// supports only one repl
// repl can be registered at any logger in the tree and will be applied to all

Loglevel functors...

...can be passed as loglevel to target specific components.

let logger = new VertexLogger({
  root: 'app-name',
  name: 'application',
  level: (info) => {
    if ( == 'specific-component') return 'trace';
    // defaults to 'info'

// The level functor is inherited into the tree of loggers
// - it overrides log levels passed as string on createLogger() child
// - it does not override loglevels passed as functions on createLogger() child

// Level by functor can also be directly assigned

logger.level = (info) => {
  if (info.ancestors.indexOf('service-name') >= 0) return 'off';
  if (info.ancestors.pop() == 'specific-parent') return 'off';
  return 'trace';


parentLogger.levelAll == 'off' || fn; // applied to all children