npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

106

v2.1.1

Published

Log library with sequences and colors, for node.js and browsers

Downloads

276

Readme

npm version build status

106

Log library with sequences and colors, for node.js and browsers

Synopsis

The numbers 106 are shaped like the word "log", but I assume you already got that.

There are lots of log libraries out there, but this one has two main targets:

  • Working the same in browsers and node.js
  • Support for sequences (flows)

When any kind of asynchronous operation take place, log lines get interleaved. This applies to server-side as well as client-side, and is the result of asynchrony per se.

To follow logs and see what lines are part of a certain code flow (a client-side outgoing call, or a server-side incoming request, e.g.), the concept of unique tags (or "sequences") help out a lot. Consider an HTTP server getting a request, performing multiple asynchronous tasks (like database operations) and then responding back. All things which get logged here, will be interleaved with other requests.

You also have the possibility to add your own custom transports (e.g. to automatically send log errors from the browser to the server).

API

The API works the same in the browser as well as in node.js.

Core logging API

// In lib/foobar.js:
var log = require( '106' )( 'lib:foobar' );

require( '106' ).level = 'debug'; // Sets log level

log.info( "Hello world", { objects: 'are allowed' } );
log.warn( "Warnings with warn()" );
log.error( "Errors with error()", new Error( "doh!" ) );

The log levels are:

silly
debug
verbose
info
warn
error

Sequences

var logger = require( '106' );
var log = logger( 'server' );
var Sequencer = logger.Sequencer;

// An http server creates a sequencer for incoming HTTP requests
var sequencer = new Sequencer( 'http', { timeout: 5000 } );

// For each incoming request:
var seq = sequencer.next( );

// Start the sequence
log.info( seq, Sequencer.IN, "Got request %s", req.path );

// Pass around 'seq' wherever logging is needed, and prepend it
// to any arguments to log.info, log.warn, log.* ... Example:
log.info( seq, "Querying database for users..." );

// When the request ends successfully (HTTP server replies to client)
log.info( seq, Sequencer.OUT, "Request finished" );
// or if the request chain failed:
var err = new Error( "Could not connect to database" );
log.error( seq, Sequencer.OUTERR, "Request failed", err );

All logging using a sequence will print the time since the sequence was created. The output will be:

2016-02-24 08:47:08.315 info - server: [seq:http:1] ⇒ Got request /my-path 1ms
2016-02-24 08:47:08.322 info - server: [seq:http:1] Querying database for users... 2ms
2016-02-24 08:47:08.324 info - server: [seq:http:1] ⇐ Request finished 3ms
2016-02-24 08:47:08.324 error - server: [seq:http:1] ⇍ Request failed 4ms
{
    name: "Error",
    message: "Could not connect to database",
    stack: [ ... ]
}

The above will be colored, and each sequence will get its own color (circulating between a few pre-defined colors). Again, this applies to node.js as well as browsers!

Custom transports

To add a custom transport, you create your own callback function, and call addTransport( ) on the logger. You can also set your own log-level using the second (optional) argument, so that this transport only get certain logs.

var logger = require( '106' );
var log = logger( 'foo' );

function customTransport( logData )
{
    logData.level;             // The log level, 'info', 'warn', etc
    logData.messages;          // The message parts (as an array)
    logData.errror;            // The error object, if that was the last
                               // argument.
    logData.meta;              // The last argument to log() if it's an
                               // object or array, and not covered by a '%s'.
    logData.prefix;            // The prefix ('foo' in this example)
    logData.sequence;          // The sequence (or null)
    logData.sequenceDirection; // The sequence direction (or null)
    logData.time;              // The time (as a javascript Date object)
    logData.timestamp;         // The time as an ISO-formatted string
}

// Forward error logs to "customTransport"
logger.addTransport( customTransport, { level: 'warn' } );

log.error( "This will be sent to the custom logger" );
log.warn( "And this" );
log.info( "But this won't" );