logger
Provides a simple logging interface as well as a LogContext
class which carries a context around.
Installation
npm install @rocicorp/logger
Usage
LogContext
LogContext
includes a context that gets included in the log message.
import {LogContext} from '@rocicorp/logger';
const lc = new LogContext('info');
lc.info('hello'); // prints "hello"
const lc2 = new LogContext('info', 'name');
lc.info('hello'); // prints "name hello"
const lc3 = lc2.addContext('bbb');
lc3.info('hello'); // prints "name bbb hello"
const lc4 = lc3.addContext('ccc');
lc4.info('hello'); // prints "name bbb ccc hello"
const lc5 = lc4.addContext('ddd', 'eee');
lc5.info('hello'); // prints "name bbb ccc ddd=eee hello"
// Or get a context logger appropriate for the Node environment.
const nlc = newNodeLogContext('debug');
nlc.info('fff'); // prints "INF fff"
OptionalLogger
interface OptionalLogger { ... }
This interface is used to provide conditional logging. It is intended to be used with conditional method calling ?.()
.
import {ConsoleLogger, type OptionalLogger} from '@rocicorp/logger';
const l: OptionalLogger = new ConsoleLogger('info');
l.info?.('hello'); // prints "hello"
l.debug?.('hello'); // does not print anything
But more importantly it does not evaluate the arguments.
import {ConsoleLogger, type OptionalLogger} from '@rocicorp/logger';
const alwaysThrows = () => {
throw new Error();
};
const l: OptionalLogger = new ConsoleLogger('info');
l.debug?.(alwaysThrows()); // does not print anything, but does not throw
LogSink
Implementing Your Own There is also the LogSink
interface which is very minimal. Its intended use is for custom log implementations.
class ExampleLogSink implements LogSink {
log(level: LogLevel, ...args: unknown[]): void {
//...
}
}
You can get an OptionalLogger
from a LogSink
using OptionalLoggerImpl
.
import {
OptionalLoggerImpl,
type LogSink,
type OptionalLogger,
} from '@rocicorp/logger';
const logSink: LogSink = new ExampleLogSink();
const l: OptionalLogger = new OptionalLoggerImpl(logSink);