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

@noveo/logger

v1.3.2

Published

Lightweight, customizable and flexible logger module. :rocket: :zap:

Downloads

15

Readme

logger

Lightweight, customizable and flexible logger module. :rocket: :zap:

How to use

npm install @noveo/logger --save
const logger = require('@noveo/logger');

logger.configure({
    transport: 'native',
    level: 'debug',
    useTimezone: true,
    applicationId: 'app-name',
    format: '{datetime} {pid} {ctx.requestId} [{level}] [{full-tag}] {message} {meta}',
    dateFormat: 'DD.MM.YYYY HH:mm:ss.SSS'
});

const log = logger.getLogger('logger-name');


log.info('Some fun message', { meta: 'object' });
// => 16.06.2018 21:00:22.521 3457 0 [info] [app-name:logger-name] Some fun message { "meta": "object" }

Context of execute

Its object contains the executing environment, such as request ID, user data, request source object and other.

API

logger.configure(options)

Configure logger. Can be executed once on start system. Config options have different fields for different transports.

const logger = require('@noveo/logger');
logger.configure({
    transport: 'native',
    level: 'debug',
    useTimezone: true,
    applicationId: 'app-name',
    format: '{datetime} {pid} {ctx.requestId} [{level}] [{full-tag}] {message} {meta}',
    dateFormat: 'DD.MM.YYYY HH:mm:ss.SSS'
})

logger.getLogger(name)

Create logger instance by base config and with the custom name. Return instance of Logger class

Logger

log.(message, [meta])

Create message with default context and write him to output stream with level "LEVEL"

log.info('Info message');
// => 31.01.2017 16:44:55.599 3457 0 [INFO] [app-name::my-module-name] Info message
log.warn('Warning message', {
    userName: 'Cool'
});
// => 31.01.2017 16:44:55.599 3457 0 [WARN] [app-name::my-module-name] Warning message {"userName": "Cool"}

log.LEVEL(ctx, message, [meta])

Create message with context and write him to output stream with level "LEVEL"

log.info({requestId: 45}, 'Info message');
// => 31.01.2017 16:44:55.599 3457 45 [INFO] [app-name::my-module-name] Info message
log.warn({requestId: 48}, 'Warning message', {
    userName: 'Cool'
});
// => 31.01.2017 16:44:55.599 3457 48 [WARN] [app-name::my-module-name] Warning message {"userName": "Cool"}

log.child(tag, [ctx])

Create child logger instance with extra context and predifined tag.

const log = logger.getLogger('tag-name');
const childLog = log.child('child-tag');
log.info('I am child!');
// => 16.02.2017 09:59:27.821 3457 0 [info] [module-name:tag-name.child-tag] I am child!
const log = logger.getLogger('tag-name');
const childLog = log.child('child-tag', {
    requestId: 75
});
log.info('I am child!');
// => 16.02.2017 09:59:27.821 3457 75 [info] [module-name:tag-name.child-tag] I am child!

log.startProfiling([tag])

Create Profile instance.

const log = logger.getLogger('tag-name');
const profile = log.startProfiling('mainController');
// => 16.02.2017 09:59:27.821 3457 0 [debug] [module-name:tag-name.profile] Profiling "mainController" start
log.info(`Current value of profile ${profile}ms`);
// => 16.02.2017 09:59:27.821 3457 0 [info] [module-name:tag-name.profile] Current value of profile 34ms
profile.stop();
// => 16.02.2017 09:59:39.821 3457 0 [debug] [module-name:tag-name.profile] Profiling "mainController" finished in 12045ms
// ... some time later
log.info(`Profile value don\`t increase - ${profile}ms`);
// => 16.02.2017 09:59:49.023 3457 0 [info] [module-name:tag-name.profile] Profile value don`t increase - 12045ms
Profile

API for render profiling messages by logger instance

new Profile(log, [tag])

Create new instance

profile.valueOf() ⇒ Profile

Get current value of profile

profile.toString() ⇒ String

Convert current value to string

profile.stop() ⇒ Profile

Stop time counting

Transports

native

Logging to STDOUT stream in one line format by template string. Settings:

  • metaSerializer {String|Function} - meta serialization function or module name (by default fast-safe-stringify)
  • format {String} - format of output message
const logger = require('@noveo/logger');
logger.configure({
    transport: 'native',
    format: '${datetime} ${ctx.requestId} [${level}] [${full-tag}] ${message} ${meta}'
})
const logger = require('@noveo/logger');
logger.configure({
    transport: 'native',
    metaSerializer: 'json-stringify-safe',
    format: '{datetime} {pid} {ctx.requestId} [{level}] [{full-tag}] {message} {meta}'
})

Parameters available for formatter string:

  • pid - process ID
  • ctx - execution context object
  • tags - list of tags
  • applicationId - Application ID (set on init logger)
  • name - logger instance name (see getLogger)
  • host - host name
  • level - logging level name
  • datetime - Datetime if format, what was set in format propertyDatetime in the format, what was set in format property
  • message - Message
  • full-tag - Artificial parameter what rendered from applicationId (if set), logger name and list of tags

logstash

Logging to STDOUT stream in logstash format. Settings:

  • prettyPrint {Boolean} - flag to print json in pretty format
  • outputStream {stream.Writable|String} - Definition of output stream. Can be a string, if so, it'll use the string as a filename to append logs to it
const logger = require('./app/components/logger');
logger.configure({
    transport: 'logstash',
    prettyPrint: true
})

native-colorized (use only for development mode)

Logging to STDOUT stream in one line format by template string. Settings:

  • metaSerializer {String|Function} - meta serialization function or module name (by default JSON.stringify)
  • format {String} - format of output message
  • colors {Object} - list of levels with color values
  • matches {Object} - list of colors with regexp
const logger = require('@noveo/logger');
logger.configure({
    transport: 'native-colorized',
    level: 'silly',
    useTimezone: true,
    applicationId: 'app-name',
    format: '{datetime} {pid} {ctx.requestId} [{level}] [{full-tag}] {message} {meta}',
    dateFormat: 'DD.MM.YYYY HH:mm:ss.SSS',
    colors: {
        error: 'red',
        warn: 'yellow',
        silly: 'magenta'
    },
    matches: {
        green: 'request:',
        bgRed: /auth/i
    }
});

const log = logger.getLogger('colorized');


log.info('Info');
log.warn('Warning');
log.error('Error');
log.debug('Debug');
log.silly('Silly');
log.info('Start request: /user/login');
log.error('Some problem with AUTH man!');

Colored screenshort

mongo

Logging to mongodb collection. Settings:

  • db {String|Object} - MongoDB connection uri or preconnected db object (optional, dafaults to localhost:27017)
  • options {Object} - MongoDB connection parameters (optional, defaults to {poolSize: 2, autoReconnect: true})
  • collection {String} - The name of the collection you want to store log messages in (optional, defaults to logs)
  • capped {Boolean} - In case this property is true, try to create new log collection as capped
  • cappedSize {Number} - Size of logs capped collection in bytes (optional, defaults to 10000000)
  • cappedMax {Number} - Size of logs capped collection in number of documents (optional)
  • expireAfterSeconds {Number} - Seconds before the entry is removed. Do not use if capped is set
const logger = require('@noveo/logger');
logger.configure({
    transport: 'mongo',
    format: '{datetime} {pid} {ctx.requestId} [{level}] [{full-tag}] {message} {meta}',
    expireAfterSeconds: 5
})

Benchmark

winston x 4,410 ops/sec ±3.48% (75 runs sampled)
bunyan x 4,090 ops/sec ±1.96% (77 runs sampled)
noveo x 4,684 ops/sec ±2.00% (61 runs sampled)
pino x 4,044 ops/sec ±7.33% (55 runs sampled)
Benchmark: ""noveo"" is the fastest.

Convetions

logger-1 and logger-2

The repo contains two special examples ./examples/logger-1 and ./examples/logger-2. The ./examples/logger-1 contains sources example of noveo-logger usage approach based on Andrey Dergaev's opinion. The ./examples/logger-2 contains sources example of noveo-logger usage approach based on my (Alexander Dobrodiy) opinion.

Run ./examples/logger-1

node ./examples/logger-1

Run ./examples/logger-2

node ./examples/logger-2

As Andrey is a tech lead, please, use his approach, not my! =) Maybe anytime we would try my approach in any microservice.

Log levels

Please use such log levels

  • error
  • warning
  • info
  • debug

How to log

Error level

  • Log any error when you have catched it and don't throw it on the next code layer

Warning level

  • When you deprecated a method, put warning on method usage
  • So prefer you have an edge case that causes sending not trivial response to the user or requires any special processing way. Prefer you understand operations team want to catch such cases and big amount of this cases follows new tasks to reduce them. So that is to log it on warning level!

Info level

  • Starting a server
  • Starting a process
  • Starting a controller
  • etc TODO Add points to the list

Debug level

  • If you are implementing a complicated algorithm you may log some values
  • So prefer you had a lot of fluent bugs of a feature. You need to catch it on any server. That is to log on debug level.
  • If you want to log something, but you understand it would generate a sheet of logs on every request, that is to log on debug level

Libraries

If you are developing a library, think it is better to use debug module or not?

What to log

  • It is necessary to log requestId (but we still don't have it).
  • Anything else?