https://github.com/rocicorp/logger
Context-carrying logger with conditional methods.
https://github.com/rocicorp/logger
Last synced: over 1 year ago
JSON representation
Context-carrying logger with conditional methods.
- Host: GitHub
- URL: https://github.com/rocicorp/logger
- Owner: rocicorp
- Created: 2022-03-17T14:49:12.000Z (over 4 years ago)
- Default Branch: main
- Last Pushed: 2024-12-09T22:07:38.000Z (over 1 year ago)
- Last Synced: 2025-04-01T02:03:40.943Z (over 1 year ago)
- Language: TypeScript
- Homepage: https://npmjs.com/package/@rocicorp/logger
- Size: 85 KB
- Stars: 13
- Watchers: 5
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
Awesome Lists containing this project
README
# 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.
```js
import {LogContext} from '@rocicorp/logger';
const lc = new LogContext('info');
lc.info('hello'); // prints "hello"
const lc2 = new LogContext('info', {name: 'alice'});
lc.info('hello'); // prints "name=alice hello"
const lc3 = lc2.withContext('bbb');
lc3.info('hello'); // prints "name=alice bbb hello"
const lc4 = lc3.withContext('ccc');
lc4.info('hello'); // prints "name=alice bbb ccc hello"
const lc5 = lc4.withContext('ddd', 'eee');
lc5.info('hello'); // prints "name=alice 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
```ts
interface OptionalLogger { ... }
```
This interface is used to provide conditional logging. It is intended to be used
with conditional method calling `?.()`.
```ts
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.
```ts
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
```
# Implementing Your Own `LogSink`
There is also the `LogSink` interface which is very minimal. Its intended use is
for custom log implementations.
```ts
class ExampleLogSink implements LogSink {
log(level: LogLevel, ...args: unknown[]): void {
//...
}
}
```
You can get an `OptionalLogger` from a `LogSink` using `OptionalLoggerImpl`.
```ts
import {
OptionalLoggerImpl,
type LogSink,
type OptionalLogger,
} from '@rocicorp/logger';
const logSink: LogSink = new ExampleLogSink();
const l: OptionalLogger = new OptionalLoggerImpl(logSink);
```