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

pinecone-logger

v2.5.0

Published

Small Javascript logger

Downloads

9

Readme

Pinecone Logger

Small and fast logger, full of seeds! npm version dependencies Status

const logger = require('pinecone-logger').new({ name: 'testLogger' });

logger.info('Hello world!'); //Outputs: "[<date>] [INFO] TESTLOGGER - Hello world!"
logger.log('Some standard log.'); //Outputs: "Some standard log."

Levels

Default levels are inspired by log4j levels.

| LEVEL | Color | Description | | ------ | ------ | ------ | | Fatal | Red BG | Severe errors that cause premature termination. | | Error | Red | Other runtime errors or unexpected conditions. | | Warn | Yellow | Use of deprecated APIs, poor use of API, 'almost' errors, other runtime situations that are undesirable or unexpected, but not necessarily "wrong". | | Success | Green | Successful events, completion of long tasks. | | Info | Cyan | Interesting runtime events (startup/shutdown). | | Debug | Magenta | Detailed information on the flow through the system. | | Trace | Blue | Most detailed information. |

Options

Several options are available to customize the logger.

const errLogger = require('pinecone-logger').apply({ 
	name: 'errorLevelLogger',
	nameTransform: false,
	showDate: false,
	level: 'error' //same as 1
});

errLogger.info('Hello world!'); //Outputs nothing, "info" is higher than "error".
errLogger.error('Some error!'); //Outputs: "[ERROR] errorLevelLogger - Some error!"

| Option | Default | Description | | ------ | ------ | ------ | | level | "debug" | Maximum log level to process and print. | | name | "" | Can be set to improve log readability. | | nameColor | "grey" | Ansi color of the name. | | nameTransform | "uppercase" | Tranforms the name to uppercase or lowercase. | | dateFormat | "UTC" or "D MMM YYYY, HH:mm:ss.SSS Z" | Defines date format, requires "moment" for custom formats, only "UTC", "ISO" and "millis" are available otherwise. | | separator | "-" | Separator to use between log informations and log value. | | colorObjects | true | Enables standard utils.inpect() object coloration. | | disableColors | false | Disables all colors. | | inspectDepth | 3 | Defines utils.inpect() depth. | | showDate | true | Shows or hides date information. | | showLevel | true | Shows or hides level information. | | showName | true | Shows or hides name information. | | ellipsisAt | 64 | Ellipsis default max length. | | maxLength | 0 | Max log length, if a log is longer ellipsis will be used. | | output | null | Offers a single output solution for both stdout and stderr, is ignored if any of stdout and stderr are defined. | | stdout | process.stdout | Stdout, can be any writable stream, function, a string ("console", "stderr", "stdout") or an object with .write(chunk: string|object) method. | | stderr | process.stderr | Stderr, can be any writable stream, function, a string ("console", "stderr", "stdout") or an object with .write(chunk: string|object) method. | | noLog | false | Disables .log() method outputs. | | type | "string" | Can be both "string" or "json", if json log will be sent to any output as a JSON object. | | secretMask | "*" | Mask or Replacement Char for secrets, default *. | | secretLevel | "debug" | Required level for secrets to be visible. | | secretMaxLength | false | Limits the number of chars for masked secrets to improve readability. |

Secrets

Secrets help hiding sensible information while in production.

const infoLogger = require('pinecone-logger').new({ 
	name: 'infoLogger',
	level: 'info'
});	
const debugLogger = require('pinecone-logger').new({ 
	name: 'debugLogger',
	level: 'debug'
});
const user = "foo";
const password = "bar123!";
const secret = infoLogger.secret(password);
const iterableSecret = infoLogger.secret([logger.br, 'User:', user, logger.br, 'Password:', password], { iterable: true , mask: '' });

// When the secret is a single argument it is resolved while the log is processed by the logger.
infoLogger.info('User', user, 'logged in with password:', secret); //Outputs: "User foo logged in with password *******".
debugLogger.info('User', user, 'logged in with password:', secret); //Outputs: "User foo logged in with password bar123!".

// String concatenation resolves the secret before the processing instead, so, if logger level < secret level, secret will be masked.
infoLogger.info('User ' + user + ' logged in with password: ' + secret); //Outputs: "User foo logged in with password *******".
debugLogger.info('User ' + user + ' logged in with password: ' + secret); //Outputs: "User foo logged in with password *******".
console.log('User ' + user + ' logged in with password: ' + secret); //Outputs: "User foo logged in with password *******".
debugLogger.info('User ' + user + ' logged in with password: ' + debugLogger.secret(password)); //Outputs "User foo logged in with password bar123!" since both debugLogger and secret levels are "debug".

// Iterable returns an array of secrets. Mask replaces the default '*'.
infoLogger.info('New user logged in.', ...iterableSecret); //Outputs: "New user logged in.".
debugLogger.info('New user logged in.', ...iterableSecret); //Outputs: "New user logged in.\n - User: foo \n - Password: bar123!".

Timers

Timers help visualizing how long is a given task. Timers are accessible from any logger from .timers property.

Logger .timers methods

| Method | Args | Description | | ------ | --- | ------ | | new() | name (string, optional) | Creates new timer. | | get() | name (string) or id (number) | Finds Timer by name or id. | | start() | name (string) or id (number) | Finds and starts a timer. | | stop() | name (string) or id (number) | Finds and stops a timer. | | resolve() | name (string) or id (number) | Finds and resolves a timer. | | valueOf() | name (string) or id (number)| Finds and returns the value of a timer. |

Timer object

| Property | Description | | ------ | ------ | | id | Returns timer id. | | value | Returns timer value. |

| Method | Description | | ------ | ------ | | start() | Starts the timer. | | stop() | Stops the timer. Can be resumed with "start()" | | resolve() | Resolves the timer. |

By resolving a timer its value will be returned and the timer itself will be deleted. Use "value" and "valueOf" to access value without stopping or destroying the timer.

const logger = require('pinecone-logger').apply({ name: 'testLogger' });
const timer = logger.timers.start('timer1');

setTimeout(() => { // Waits 500ms
	const value = timer.value;
	logger.log('Testing timer after 500ms: ' + value.pretty + '(' + value + 'ms).'); 
	// Outputs "Testing timer after 500ms: 500ms (500ms).".
	logger.log('Pausing timer for 200ms');
	timer.stop(); // Stops timer.
	setTimeout(() => {
		logger.timers.start('timer1'); // Starts timer by name.
	}, 200);
}, 500);

setTimeout(() => { // Waits 1400ms
	const value = logger.timers.resolve(timer.toString()); // Resolves timer by id
	logger.log("Resolving timer after 1400ms, paused for 200ms: " + value.pretty + '(' + value + 'ms).');
	// Outputs "Resolving timer after 1400ms, paused for 200ms: 1s 200ms (1200ms).".
	// Timer counted only 1200ms as it was stopped for 200ms.
}, 1400);

Title

Title allows fast creation of standard titles.

Title accepts a string, for single-line titles, or an array of strings, for multi-line titles.

Three types are available:

----------------------------
-- This is a type 0 title --
-- Aligned left           --
----------------------------
|----------------------------|
|-- This is a type 1 title --|
|--          Aligned right --|
|----------------------------|
   /-----------------------------/
  /-- This is a type 2 title ---/
 /---     Aligned center     --/
/-----------------------------/
logger.title(title: string | string[], options?: object)

| Option | Default | Description | | ------ | ------ | ------ | | char | "-" | Frame char. | | type | 0 | Type of title. Can be 0, 1 or 2. | | sideChar | "|", "/" | Side char(s). Available only for type 1 and 2. | | side | 2 | Represents how many "char" will be placed on text line sides. | | color | false | Text color. | | frameColor | false | Frame color. | | align | "left" | Multi-line text alignment. Can be "rignt", "left" or "center". |

const logger = require('pinecone-logger').new({ name: 'titleLogger' });
logger.log(logger.title('Single line title'));
//  -----------------------
//  -- Single line title --
//  -----------------------

logger.log(logger.title(['Multi line', '', 'Title'], { char: '=', type: 1, align: 'center', sideChar: '||', side: 0 }));
//  ||============||
//  || Multi line ||
//  ||            ||
//  ||   Title    ||
//  ||============||

Ellipsis

Ellipsis trims strings over a given length and places '...' (or else) at the end.

logger.ellipsis(input: string, length?: number, replacement?: string); 
const logger = require('pinecone-logger').new({ name: 'titleLogger' });
logger.log(logger.ellipsis('1234567890', 6)); // 123...
logger.log(logger.ellipsis('1234567890', 6, ';')); // 12345;

Groups

Groups can spread logs to multiple loggers with a single call.

logger.newGroup(...members: Logger[]);

group.add(members: Logger);
group.remove(member: number|Logger);
const loggerParent = require('pinecone-logger');
const loggerChild1 = require('pinecone-logger').new({ name: 'GroupMember1' });
const loggerChild2 = require('pinecone-logger').new({ name: 'GroupMember2' });
loggerParent.apply({ name: 'GroupLeader', level: 'info' });


loggerParent.info('I\'ll be the group leader, my level is', loggerParent.level );
loggerChild1.info('I\'ll be the group member 1, my level is', loggerChild1.level );
loggerChild2.info('I\'ll be the group member 2, my level is', loggerChild2.level );
logger.log();
const loggerGroup = loggerParent.newGroup(loggerChild1);
loggerGroup.info('This is from a group, should be printed twice.');
loggerGroup.debug('This is also from a group, but should only be printed once from member 1 as leader level is "info".');
loggerGroup.add(loggerChild2);
loggerGroup.success('New logger added to group.', 'This should be printed three times.');
loggerGroup.remove(0);
loggerGroup.remove(loggerChild2);
loggerGroup.warn('All members removed from group.', 'This should be printed once.');

Globals

Global loggers can be accessed anywhere.

// file 1
const globalLogger = require('pinecone-logger').new({ global: 'global-1' });
// file 2
const logger = require('pinecone-logger').globals.get('global-1');