# CompositeLogger

A logger implementation that delegates log entries to multiple underlying loggers. It implements the standard RootLogger and LoggerScope interfaces so it can be used anywhere a single logger is expected, but internally it forwards each chained segment-building and logging calls to underlying loggers.

# Reference

const logger = new CompositeLogger(loggers);

# Parameters

  • loggers: An array of Logger instances.

# Methods

Refer to the RootLogger and LoggerScope documentation.

# Usage

# Log a debug entry

import { CompositeLogger, ConsoleLogger } from "@workleap/logging";
import { LogRocketLogger } from "@workleap/logrocket";

const logger = new CompositeLogger([
    new ConsoleLogger(),
    new LogRocketLogger()
]);

logger.debug("Hello world!");

# Log an information entry

import { CompositeLogger, ConsoleLogger } from "@workleap/logging";
import { LogRocketLogger } from "@workleap/logrocket";

const logger = new CompositeLogger([
    new ConsoleLogger(),
    new LogRocketLogger()
]);

logger.information("Hello world!");

# Log a warning entry

import { CompositeLogger, ConsoleLogger } from "@workleap/logging";
import { LogRocketLogger } from "@workleap/logrocket";

const logger = new CompositeLogger([
    new ConsoleLogger(),
    new LogRocketLogger()
]);

logger.warning("Hello world!");

# Log an error entry

import { CompositeLogger, ConsoleLogger } from "@workleap/logging";
import { LogRocketLogger } from "@workleap/logrocket";

const logger = new CompositeLogger([
    new ConsoleLogger(),
    new LogRocketLogger()
]);

logger.error("Hello world!");

# Log a critical entry

import { CompositeLogger, ConsoleLogger } from "@workleap/logging";
import { LogRocketLogger } from "@workleap/logrocket";

const logger = new CompositeLogger([
    new ConsoleLogger(),
    new LogRocketLogger()
]);

logger.critical("Hello world!");

# Filter log entries

Minimum severity entries to process is configured on an invidual logger basis.

import { CompositeLogger, ConsoleLogger, LogLevel } from "@workleap/logging";
import { LogRocketLogger } from "@workleap/logrocket";

const logger = new CompositeLogger([
    new ConsoleLogger({
        logLevel: LogLevel.error
    }),
    new LogRocketLogger({
        logLevel: LogLevel.debug
    })
]);

// Will be ignored because "debug" is lower than the "error" severity.
logger.debug("Hello world!");

# Build complex log entry

Multiple segments can be chained to create a log entry that combines styled text, errors, and objects. To process all segments and output the log to the console, complete the chain by calling any log method.

import { CompositeLogger, ConsoleLogger } from "@workleap/logging";
import { LogRocketLogger } from "@workleap/logrocket";

const logger = new CompositeLogger([
    new ConsoleLogger(),
    new LogRocketLogger()
]);

logger
    .withText("Processing segment")
    .withObject({ id: 1 })
    .withText("failed with error")
    .withError(new Error("The error"))
    .debug();

# Style a log entry

Not all loggers support styled log entries. When the underlying loggers do support styling, those styles will be passed forwared to them.

import { CompositeLogger, ConsoleLogger } from "@workleap/logging";
import { LogRocketLogger } from "@workleap/logrocket";

const logger = new CompositeLogger([
    new ConsoleLogger(),
    new LogRocketLogger()
]);

logger
    .withText("Hello", {
        style: {
            backgroundColor: "green",
            color: "white",
        }
    })
    .withText("World", {
        style: {
            backgroundColor: "blue",
            color: "white"
        }
    })
    .information();

# Use a logging scope

import { CompositeLogger, ConsoleLogger } from "@workleap/logging";
import { LogRocketLogger } from "@workleap/logrocket";

const logger = new CompositeLogger([
    new ConsoleLogger(),
    new LogRocketLogger()
]);

const scope = logger.startScope("Module 1 registration");

scope.debug("Registering routes...");

scope
    .withText("Routes registered!")
    .withObject([{
        path: "/foo",
        label: "Foo"
    }])
    .debug();

scope.debug("Fetching data...");

scope
    .withText("Data fetching failed")
    .withError(new Error("The specified API route doesn't exist."))
    .error();

scope.debug("Registration failed!", {
    style: {
        backgroundColor: "red",
        color: "white",
        fontWeight: "bold"
    }
});

// Once the scope is ended, the log entries will be outputted to the console.
scope.end();

# Dismiss a logging scope

A scope can be dismissed to prevent it's log entries from being outputted to the console.

import { CompositeLogger, ConsoleLogger } from "@workleap/logging";
import { LogRocketLogger } from "@workleap/logrocket";

const logger = new CompositeLogger([
    new ConsoleLogger(),
    new LogRocketLogger()
]);

const scope = logger.startScope("Module 1 registration");

scope.debug("Registering routes...");

scope
    .withText("Routes registered!")
    .withObject([{
        path: "/foo",
        label: "Foo"
    }])
    .debug();

scope.debug("Fetching data...");

// Will not output any log entries to the console.
scope.end({ dismiss: true });

# Style the scope label at creation

A scope label can be styled when the scope is created.

import { CompositeLogger, ConsoleLogger } from "@workleap/logging";
import { LogRocketLogger } from "@workleap/logrocket";

const logger = new CompositeLogger([
    new ConsoleLogger(),
    new LogRocketLogger()
]);

const scope = logger.startScope("A scope", {
    labelStyle: {
        backgroundColor: "purple",
        color: "white"
    }
});

scope.information("Hello world!");
scope.end();

# Style the scope label at end

A scope label can be styled when the scope it's ended. This is particularly useful to style the label accordingly to the status of an operation or request.

import { CompositeLogger, ConsoleLogger } from "@workleap/logging";
import { LogRocketLogger } from "@workleap/logrocket";

const logger = new CompositeLogger([
    new ConsoleLogger(),
    new LogRocketLogger();
]);

const scope = logger.startScope("A scope");

scope.information("Hello world!");

scope.end({
    labelStyle: {
        backgroundColor: "purple",
        color: "white"
    }
});