Skip to content

Standardized application logging with winston

Notifications You must be signed in to change notification settings

reagent/logging

Repository files navigation

Logging

A winston-based logger with standardized JSON and plaintext formatting.

Installation

Install from NPM:

$ yarn add @reagent/logging

Usage

The logger supports all the common syslog levels. To create your logger use the createLogger() helper function and make sure you emit to either stdout or a filePath (or both):

import path from 'path';
import { createLogger } from '@reagent/logger';

const stdoutLogger = createLogger({ stdout: true });
stdoutLogger.info('Message to stdout'); // Will emit a message at `info` level to your console

const fileLogger = createLogger({
  filePath: path.resolve(__dirname, 'log', 'messages.log'),
});
fileLogger.info('Message to file'); // Will emit a message at `info` level to the target file

The logger is configured to emit logs at 'info' level, but this can be modified as needed:

const { NODE_ENV } = process.env;

const logger = createLogger({
  stdout: true,
  level: NODE_ENV === 'production' ? 'warning' : 'info',
});

logger.info('Informational message'); // Not emitted in 'production'
logger.warning('Warning message');

By default, logs are formatted as plaintext, but you can format as json as well:

const plainLogger = createLogger({ stdout: true });
plainLogger.info('Message in Plain');
// [2023-02-11T17:12:06.459Z] (info): Message in Plain

const jsonLogger = createLogger({ stdout: true, format: 'json' });
jsonLogger.info('Message in JSON');
// {"level":"info","message":"Message in JSON","timestamp":"2023-02-11T17:12:06.461Z"}

You can also provide a source and any additional information to the log messages. The use of generics supports constraints and type inference for the source attribute:

const logger = createLogger<'app' | 'db'>({ stdout: true });
logger.info('Message from application', { source: 'app' });
// [2023-02-11T17:15:37.260Z] (info): Message from application source=app

logger.info('Message from database', { source: 'db' });
// [2023-02-11T17:16:33.715Z] (info): Message from database source=db

logger.info('Message from application with extra', {
  source: 'app',
  request: { path: '/user' },
});
// [2023-02-11T17:15:37.262Z] (info): Message from application with extra source=app request={"path":"/user"}

As in previous examples, emitting the logs as json is also possible.

About

Standardized application logging with winston

Resources

Stars

Watchers

Forks

Packages

No packages published