This is a simple logging framework specifically build for NodeJS.
I have been using several logging frameworks in the past, but I had always issues with one or another quirks of each. After comparing how each of them works, as well as looking for more inspiration in the Rust logging frameworks I came up with the design for this logging library.
Logforth supports both pretty printing for development and ndjson
output for production. Each log entry has a
mandatory message and optional attributes. Attributes are included as-is in ndjson
output and pretty printed in
development.
npm i logforth
pnpm add logforth
First you want to instantiate a new instance of the logger:
import {Logger} from "logforth";
const logger = new Logger();
logger.info("First logger test");
By default, Logforth will log all events. You can limit this through the minLevel
option:
import {Logger, LogLevel} from "logforth";
const logger = new Logger({ minLevel: LogLevel.Info });
In order to disable logging completely you can pass disableLogging
to minLevel
:
import {Logger, disableLogging} from "logforth";
const logger = new Logger({ minLevel: disableLogging });
In development, you might prefer to see pretty printed log message. A simple switch between production and development could look like this:
import {Logger, NdJsonTransport, PrettyTransport} from "logforth";
const logger = new Logger({
transport: process.env.NODE_ENV === "production"
? new NdJsonTransport()
: new PrettyTransport()
});
You can pass arbitrary attributes to each log entry:
logger.info("I contain attributes", { foo: "bar" });
In ndjson
output they will be inlined with the rest of the log entry. Thus, you must not use the following attribute
names: time
, level
and msg
.
If you want to have specific attributes always present, e.g. the hostname of the running process, you can include this in the constructor:
const logger = new Logger({ attributes: { "hostname": "foo" } });
Logforth supports logging in context aware situation, for instance when you want to keep track of a request ID. You can
do so through the withContext()
method. The following example demonstrates how to do this in Koa:
koaApp.use((context, next) => {
return logger.withContext({ requestId: "foo" }, next);
});