1.4.0 • Published 5 years ago

slf4ts-api v1.4.0

Weekly downloads
11
License
MIT
Repository
github
Last release
5 years ago

slf4ts-api

Simple Logging Facade for NodeJS

Inspired by the popular Java lib SLF4J

This project is used to abstract logging
to develop reusable libraries and not force the usage
of a certain logging framework.

It's meant to be used with nodejs.

LogLevel

  • TRACE (numeric value: 4)
  • DEBUG (numeric value: 3)
  • INFO (numeric value: 2)
  • WARN (numeric value: 1)
  • ERROR (numeric value: 0)

Logger Implementations

slf4ts doesn't work without a logging-framework binding.
Bindings exist for a couple of logging-frameworks:

Write a binding

A binding for a logging-framework needs to implement the LoggerBinding interface and
the actual logger interface LoggerImplementation.
Also a file named .slf4ts-binding needs to be present in the package folder (can be empty).

A node package for a binding should export a single function that is used during binding discovery.

Interfaces to implement:

import { LogLevel } from "slf4ts-api";

interface LoggerImplementation {
    log(...args: any[]): Promise<any>;
    getImplementation<T>(): T;
    setConfig<T>(config: T, group: string, name: string): void;
    setLogLevel(logLevel: LogLevel, group: string, name: string): void;
    setMetadata(metadata: any, group: string, name: string): void;
}

interface LoggerBinding {
    getLoggerImplementation(): LoggerImplementation;
    getVendor(): string;
    getVersion(): string;
}

Sample implementation in typescript (index.ts):

import { LoggerBindings } from "slf4ts-api";

export default function(bindings: LoggerBindings) {
    bindings.registerBinding({
        getLoggerImplementation: () => { ... },
        getVendor: () => "My Logger Binding Implementation",
        getVersion: () => "1.0.0"
    });
}

An example implementation can be found in the example-node-modules folder of this project.

Usage

import { LoggerConfiguration, LogLevel, LoggerFactory } from "slf4ts-api";

// gets the root logger (group "" and name "")
const ROOT_LOGGER = LoggerFactory.getLogger();

class X {

    // gets a logger with group "my-lib" and name "X"
    private static LOG = LoggerFactory.getLogger("my-lib", "X");

    public async something(value: any) {
        // log with debug level and some metadata
        X.LOG.debug(`a message with ${value}`, { additionalData: "Testvalue" });

        try {
            ...
        } catch(error: Error) {
            // logs an error without metadata
            X.LOG.error('Error!', error);
        }
    }

}

// sets the log level of all loggers
LoggerConfiguration.setLogLevel(LogLevel.INFO);

// sets the log level of all loggers within group "my-lib"
LoggerConfiguration.setLogLevel(LogLevel.WARN, "my-lib");

// sets the log level of the logger with group "my-lib" and name "X"
LoggerConfiguration.setLogLevel(LogLevel.ERROR, "my-lib", "X");

const config = {
    transports: [...],
    events: [...],
    postProcessor: () => { ... }
};

// sets the config of all loggers
LoggerConfiguration.setConfig(config);

// sets the config of all loggers within group "my-lib"
LoggerConfiguration.setConfig(config, "my-lib");

// sets the config of the logger with group "my-lib" and name "X"
LoggerConfiguration.setConfig(config, "my-lib", "X");

License

MIT