Spaces:
Paused
Paused
# Logger | |
Environment-agnostic, ESM-friendly logger for simple needs. | |
## Why does this exist? | |
I've been using `debug` for quite some time but wanted to migrate my projects to better ESM support. Alas, `debug` doesn't ship as ESM so I went and wrote this little logger just for my needs. You will likely see it printing useful data in Mock Service Worker and beyond. | |
## Installation | |
```sh | |
npm install @open-draft/logger | |
``` | |
## Usage | |
This package has the same API for both browser and Node.js and can run in those environments out of the box. | |
```js | |
// app.js | |
import { Logger } from '@open-draft/logger' | |
const logger = new Logger('parser') | |
logger.info('starting parsing...') | |
logger.warning('found legacy document format') | |
logger.success('parsed 120 documents!') | |
``` | |
Logging is disabled by default. To enable logging, provide the `DEBUG` environment variable: | |
```sh | |
DEBUG=1 node ./app.js | |
``` | |
> You can also use `true` instead of `1`. You can also use a specific logger's name to enable [logger filtering](#logger-filtering). | |
## API | |
- Class: `Logger` | |
- [`new Logger(name)`](#new-loggername) | |
- [`logger.debug(message, ...positionals)`](#loggerdebugmessage-positionals) | |
- [`logger.info(message, ...positionals)`](#loggerinfomessage-positionals) | |
- [`logger.success(message, ...positionals)`](#loggersuccessmessage-positionals) | |
- [`logger.warning(message, ...positionals)`](#loggerwarningmessage-positionals) | |
- [`logger.error(message, ...positionals)`](#loggererrormessage-positionals) | |
- [`logger.extend(name)`](#loggerextendprefix) | |
- [`logger.only(callback)`](#loggeronlycallback) | |
### `new Logger(name)` | |
- `name` `string` the name of the logger. | |
Creates a new instance of the logger. Each message printed by the logger will be prefixed with the given `name`. You can have multiple loggers with different names for different areas of your system. | |
```js | |
const logger = new Logger('parser') | |
``` | |
> You can nest loggers via [`logger.extend()`](#loggerextendprefix). | |
### `logger.debug(message, ...positionals)` | |
- `message` `string` | |
- `positionals` `unknown[]` | |
Prints a debug message. | |
```js | |
logger.debug('no duplicates found, skipping...') | |
``` | |
``` | |
12:34:56:789 [parser] no duplicates found, skipping... | |
``` | |
### `logger.info(message, ...positionals)` | |
- `message` `string` | |
- `positionals` `unknown[]` | |
Prints an info message. | |
```js | |
logger.info('new parse request') | |
``` | |
``` | |
12:34:56:789 [parser] new parse request | |
``` | |
### `logger.success(message, ...positionals)` | |
- `message` `string` | |
- `positionals` `unknown[]` | |
Prints a success message. | |
```js | |
logger.success('prased 123 documents!') | |
``` | |
``` | |
12:34:56:789 β [parser] prased 123 documents! | |
``` | |
### `logger.warning(message, ...positionals)` | |
- `message` `string` | |
- `positionals` `unknown[]` | |
Prints a warning. In Node.js, prints it to `process.stderr`. | |
```js | |
logger.warning('found legacy document format') | |
``` | |
``` | |
12:34:56:789 β [parser] found legacy document format | |
``` | |
### `logger.error(message, ...positionals)` | |
- `message` `string` | |
- `positionals` `unknown[]` | |
Prints an error. In Node.js, prints it to `process.stderr`. | |
```js | |
logger.error('failed to parse document') | |
``` | |
``` | |
12:34:56:789 β [parser] failed to parse document | |
``` | |
### `logger.extend(prefix)` | |
- `prefix` `string` Additional prefix to append to the logger's name. | |
Creates a new logger out of the current one. | |
```js | |
const logger = new Logger('parser') | |
function parseRequest(request) { | |
const requestLogger = logger.extend(`${request.method} ${request.url}`) | |
requestLogger.info('start parsing...') | |
} | |
``` | |
``` | |
12:34:56:789 [parser] [GET https://example.com] start parsing... | |
``` | |
### `logger.only(callback)` | |
Executes a given callback only when the logging is activated. Useful for computing additional information for logs. | |
```js | |
logger.only(() => { | |
const documentSize = getSizeBytes(document) | |
logger.debug(`document size: ${documentSize}`) | |
}) | |
``` | |
> You can nest `logger.*` methods in the callback to `logger.only()`. | |
## Log levels | |
You can specify the log levels to print using the `LOG_LEVEL` environment variable. | |
There are the following log levels: | |
- `debug` | |
- `info` | |
- `success` | |
- `warning` | |
- `error` | |
> Providing no log level will print all the messages. | |
Here's an example of how to print only warnings: | |
```js | |
// app.js | |
import { Logger } from '@open-draft/logger' | |
const logger = new Logger('parser') | |
logger.info('some info') | |
logger.warning('some warning') | |
logger.error('some error') | |
``` | |
```js | |
LOG_LEVEL=warning node ./app.js | |
``` | |
``` | |
12:34:56:789 β [parser] some warning | |
``` | |
## Logger filtering | |
You can only print a specific logger by providing its name as the `DEBUG` environment variable. | |
```js | |
// app.js | |
import { Logger } from '@open-draft/logger' | |
const appLogger = new Logger('app') | |
const parserLogger = new Logger('parser') | |
appLogger.info('starting app...') | |
parserLogger.info('creating a new parser...') | |
``` | |
```sh | |
DEBUG=app node ./app.js | |
``` | |
``` | |
12:34:56:789 [app] starting app... | |
``` | |