0.1.0 • Published 4 months ago

fly-logging v0.1.0

Weekly downloads
-
License
MIT
Repository
github
Last release
4 months ago

Fly Logging

Fly Logging is a lightweight, standalone logging tool designed for simplicity and flexibility. With features like runtime log filtering, color-coding, and conditional logging, it enhances development efficiency by enabling easy toggling of specific log messages, helping to avoid unnecessary code rewrites.

Core Concept

The core concept of Fly Logging revolves around the idea that logging should be a flexible and integral part of the development and debugging process. Unlike traditional loggers that follow a one-dimensional level hierarchy, Fly Logging introduces a more dynamic approach, allowing developers to easily filter and manage logs. This makes Fly Logging not just a tool for logging errors but a versatile instrument to streamline development workflows.

Out-of-the-box features include:

  • Tag-Based and Filename Filtering: Easily filter logs by tags or originating files.
  • Flexible Settings: Tailor Fly Logging to your needs with customizable settings.
  • Automatic Filename Detection: Automatically detect and log the source filename.
  • Log Customization: Modify log appearance and behavior for specific messages.
  • Level Customization: Define and use custom log levels with unique filters.
  • Enhanced Readability: Smart spacing for clearer and more readable log messages.

Table of Contents

Installation

Method 1 (NPM)

To install with npm, simply run the command

npm i @slasherrose/fly-logging

Method 2 (Copy-Paste)

To manually add Fly Logging to your project, follow these instructions:

For CommonJS

1) Download the dir /src/commonjs 2) Insert it into your project. 3) Rename the dir commonjs to fly-logging for clarity 4) Import the module as follows const { Fly } = require(./fly-logging/index.cjs)

For ECMAScript

1) Download the dir /src/module 2) Insert it into your project. 3) Rename the dir module to fly-logging for clarity 4) Add the requirement as follows import { Fly } from "./fly-logging/index.js";

(back to top)

Documentation

Usage

Quick Start

Initialize Fly
Create a Fly instance with a unique identifier.

const fly = Fly("uniqueID");

(NOTE: Unless otherwise specified by the settings, a Fly instance uses standard logging functions (see Levels for more details))

Log A Message Use the log method followed by .out() to output your message.

fly.log("Your log message").out();

Colors

Logs messages can be given a color in line to help with identification:

const fly = new Fly("demo", { defaultMessageColor: "BLUE"})

fly.log("Normal message").out();				// This will print with default color BLUE
fly.log("IMPORTANT!!").color("RED").out();		// This will print as red
fly.log("Another normal message.").out();		// This will print with default color BLUE

(NOTE: The color function only affects the color of the message, not additional log attributes. You can adjust those through the settings object).

Conditional Coloring

Conditional coloring allows you to color log messages only if a condition is met:

const n = 3;
fly.log("when n is 3, I am green!")
	.color("RED")
	.if(n < 3)			// When this condition is met, the log message will be RED
	.color("GREEN")
	.if(n === 3)		// When this condition is met, the log message will be GREEN
	.color("YELLOW")
	.if(n > 3)			// When this condition is met, the log message will be YELLOW
	.out();

List Of Available Colors

colorANSI
Black\u001b[30m
Red\u001b[31m
Green\u001b[32m
Yellow\u001b[33m
Blue\u001b[34m
Magenta\u001b[35m
Cyan\u001b[36m
White\u001b[37m
Reset\u001b[0m
Light_Black\u001b[90m
Light_Red\u001b[91m
Light_Green\u001b[92m
Light_Yellow\u001b[93m
Light_Blue\u001b[94m
Light_Magenta\u001b[95m
Light_Cyan\u001b[96m
Light_White\u001b[97m

Tagging

Tagging can be a useful feature for log identification and blacklisting messages.

fly.log("hello world!").tag("hello_world").out();

You can also have multiple tags on the same log

fly.log("Foo Bar")
	.tag("foo")
	.tag("bar")
	.out();

Conditional Tagging

Conditional tagging allows you to tag log messages only if a condition is met:

const start = true;
fly.log("hello world!")
	.tag("is_start")
	.if(start)			// if start is set to true, then this will have the above tag. 
	.out();

Conditional Logging

It is possible to run a log only when certain conditions are met, similar to the conditional tagging and conditional coloring.

fly.log("I will print")
	.if(1 === 1) 						
	.out();

fly.log("I will not print")
	.if(1 === 2)
	.out();

(NOTE: In order to run the .if() command for the log as a whole, you cannot put it after a .color() or .tag(), as that will perform a conditional color or conditional tagging)

(back to top)

Settings

Settings can be passed as the second parameter while initializing a fly

const fly = new Fly("demo", {printTags: false, ... })

Settings List

SettingDescriptionDefault Value
filenameif provided, then will override the auto-detected filenamenull
autoDetectFileNamewhen true, the fly will attempt to detect the name of the file it is located intrue
noColorswhen true, no colors will be generated in the log regardless of other settingsfalse
defaultMessageColorthe default color that all messages will be"BLUE"
defaultFileNameColorthe default color for the file name"CYAN"
defaultIdColorthe default color for the log ID"MAGENTA"
defaultLevelColorthe default color for the log level"YELLOW"
defaultTagsColorthe default color for the log tags"GREEN"
levelsan object containing different log levels and their configurationsSee Section "Levels"
keepDefaultLevelswhen true, keeps the default log levels providedtrue
thresholdLevelthe minimum log level required for a log to be displayed0
allowStringReturnwhen true, allows logs to return a string (will continue to print as normal)true
printTagswhen true, prints the tags associated with a logtrue
printLevelwhen true, prints the log levelfalse
printFileNamewhen true, prints the file nametrue
printIdwhen true, prints the log IDtrue
printLabelswhen true, prints the labels (fileName, id, message, level, tags) in the specified ordertrue
printOrderan array specifying the order in which the labels should be printed"fileName", "id", "message", "level", "tags"
logDelimiterthe delimiter used to separate sections of the logs when printing"; "
tagDelimiterthe delimiter used to separate tags when printing", "
blacklistSee section On Blacklistingundefined
whitelistSee section On Whitelistingundefined

Levels

The levels object contains different log levels and their configurations.

Default Levels

NameValueDefault Color
trace10-
debug100-
log200-
info300-
warn400YELLOW
error500RED
critical1000RED

Custom Log Levels

You can customize the log levels and their configurations according to your requirements.

Example

const { LogLevel } = require("fly-logging")

const settings = {
	fileName: fileName,
	keepDefaultLevels: true, // keep defaults (trace, log, error, etc)
	levels: {
		foo: new LogLevel({ value: 12 }), // Create a new level called "foo" with value of 12 (useful for threshholding)
		bar: new LogLevel({ value: 2000, defaultColor: "RED", forceCaps: true}) // Create a new level called "bar"
	},
};

const fly = Fly("demo", settings);

fly.log("default log level").out();
fly.foo("custom log level").out();
fly.bar("custom log level with color and forced caps").out();

(back to top)

Configuring Blacklists And Whitelists

Control what gets logged with blacklist and whitelist features:

  • Blacklist: Specify logs that should be ignored.
  • Whitelist: Define logs that are always displayed, regardless of other settings.

Creating A Blacklist / Whitelist

The following attributes can be black/whitelisted as needed:

  • id
  • filename
  • tag

(NOTE: To filter by log level, set the fly's thresholdLevel level in its settings)

How To Use

You can combine attributes for more complex filtering. To block when two or more parameters are both present, add them to the same object in your black/whitelist. To block when any/either of the parameters are met, add them to different objects.

Blacklist Examples

 [
	{"file": "file1.js", "tag": "foo"}, 
	{"id": "badFlyId", "tags": ["foo", "bar"]} 
]
	const blacklist = require("blacklist.json");

	// RULE ONE {"file": "file1.js", "tag": "foo"}
	const fly = new Fly("fly", {fileName: "file1.js", blacklist});
	fly.log("hello world!").out(); // this will print, because it does not contain the prohibited tag
	fly.log("hello world!").tag("bar").out(); // this will print, because this tag is not prohibited for this file/id
	fly.log("hello world!").tag("foo").out(); // this will NOT print, because the tag and fileName match the prohibited values

	...

	// RULE TWO {"id": "badFlyId", "tags": ["foo", "bar"]}  
	
	const fly2 = new Fly("badFlyId", {fileName: "notBlacklisted.js", blacklist});
	fly2.log("hello world!").out(); //This will print, because it is not tagged with EITHER of the prohibited tags (foo and bar)
	fly2.log("hello world!").tag("foo").out(); // this will print, because it is tagged with ONLY ONE of the prohibited tags
	fly2.log("hello world!").tag("foo").tag("bar").out(); // this will NOT print, because has a forbidden id and BOTH prohibited tags for that ID
	

(NOTE: the rule shown above for blacklists also apply to whitelists)

Blacklisting via Factory Function

For a project-wide blacklist, consider using a FlyFactory that reads from a JSON file.

Example FlyFactory with Blacklist
const blacklist = require("blacklist.json");
const { Fly } = require("fly-logging");

function FlyFactory(id, settings) {
	return new Fly(id, {...settings, blacklist: blacklist})
}

(back to top)

Examples

Example (basic)

const fly = Fly("demo"); // creates fly with default settings

fly.log("hello world").out();

Example (advanced)

const { Fly } = require("fly-logging");

const fly = Fly("counterTrackingFly", {
	printFileName: false,
	printId: false,
});
let number = 0;
fly.log("the number is currently", number, ".").out();

while (number < 5) {
	number++;

	fly.log("the number is now '", number, "'")
        .tag("count")
        .out();

	fly.log("the number (", number, ") is even") // print this log only when the number is even.
		.if(number % 2 === 0)
		.color("RED") // When this log runs, color the message red.
		.tag("parity")
		.out();
}

fly.log("the number has finished counting. It is now at", number, ".")
	.color("green")
	.if(number % 2 === 0) // If the number is even when it ends, color it green.
	.color("magenta")
	.if(number % 2 !== 0) // If the number is odd when it ends, color it magenta.
	.out();

(back to top)